Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
0a88894
Extract ChannelLogic interface.
VelikovPetar Dec 1, 2025
487a155
Rename LegacyChannelLogic to ChannelLogicLegacyImpl.
VelikovPetar Dec 1, 2025
fc7f9c5
Route propagateChannelQuery via ChannelLogic.
VelikovPetar Nov 3, 2025
471a09d
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 1, 2025
9a199f0
Refactor loadNewest return type to use Result instead of kotlin.Result
VelikovPetar Dec 1, 2025
60a884c
Refactor ChannelMutableState and ChannelState to remove unused typing…
VelikovPetar Dec 1, 2025
dcfbfd0
Extract ChannelEventHandler.
VelikovPetar Dec 1, 2025
e8d62f0
Event handling bugfixes.
VelikovPetar Dec 10, 2025
af61ee9
Rename ChannelLogicImpl.kt.
VelikovPetar Dec 10, 2025
28c4e2f
Rename ChannelLogicImpl.kt.
VelikovPetar Dec 10, 2025
b4617e0
Fix tests.
VelikovPetar Dec 10, 2025
9a8aab3
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 10, 2025
9b9673c
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 11, 2025
e6feef4
Update CHANGELOG.md.
VelikovPetar Dec 11, 2025
640cdd2
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 11, 2025
9291522
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 12, 2025
ffbcb2d
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 18, 2025
de40e26
Fix PR remarks.
VelikovPetar Dec 18, 2025
72f61d9
Fix pinned messages not updated on message.updated.
VelikovPetar Dec 19, 2025
0555219
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 22, 2025
0588c11
Revert update/upsert fixes.
VelikovPetar Dec 23, 2025
24ff476
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 23, 2025
594c699
Post-merge fix.
VelikovPetar Dec 23, 2025
f99545f
Update CHANGELOG.md.
VelikovPetar Dec 23, 2025
e7a4a4c
Remove unused method and update logs.
VelikovPetar Dec 23, 2025
a9d290e
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 23, 2025
42a2dbf
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 23, 2025
6c323a4
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 24, 2025
d25676f
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 29, 2025
c06ec73
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 29, 2025
9690f3d
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Dec 30, 2025
aad97c9
Merge branch 'develop' into feature/AND-887_channel_logic_refactoring
VelikovPetar Jan 8, 2026
69bbca9
Fix tests.
VelikovPetar Jan 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

## stream-chat-android-state
### 🐞 Fixed
- Fix `message.updated` and `message.deleted` events unhiding the channel. [#6038](https://github.com/GetStream/stream-chat-android/pull/6038)

### ⬆️ Improved

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import io.getstream.chat.android.models.MessageReminder
import io.getstream.chat.android.models.NeutralFilterObject
import io.getstream.chat.android.models.Poll
import io.getstream.chat.android.models.Reaction
import io.getstream.chat.android.models.ThreadInfo
import io.getstream.chat.android.models.User
import io.getstream.chat.android.models.Vote
import io.getstream.chat.android.models.querysort.QuerySortByField
Expand All @@ -86,6 +87,7 @@ import io.getstream.chat.android.randomPollAnswer
import io.getstream.chat.android.randomPollVote
import io.getstream.chat.android.randomReaction
import io.getstream.chat.android.randomString
import io.getstream.chat.android.randomThreadInfo
import io.getstream.chat.android.randomUser
import java.util.Date

Expand Down Expand Up @@ -291,6 +293,7 @@ public fun randomNotificationMarkReadEvent(
unreadChannels: Int = randomInt(),
lastReadMessageId: String? = randomString(),
threadId: String? = randomString(),
thread: ThreadInfo? = randomThreadInfo(),
unreadThreads: Int? = randomInt(),
unreadThreadMessages: Int? = randomInt(),
): NotificationMarkReadEvent = NotificationMarkReadEvent(
Expand All @@ -305,6 +308,7 @@ public fun randomNotificationMarkReadEvent(
unreadChannels = unreadChannels,
lastReadMessageId = lastReadMessageId,
threadId = threadId,
thread = thread,
unreadThreads = unreadThreads,
unreadThreadMessages = unreadThreadMessages,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public interface ChannelState {
public val messagesState: StateFlow<MessagesState>

/** The collection of messages from previous pages of data.*/
@Deprecated("This property is not used anymore and will be removed in future versions.")
public val oldMessages: StateFlow<List<Message>>

/** The number of people currently watching the channel.*/
Expand Down Expand Up @@ -131,7 +132,7 @@ public interface ChannelState {
public fun toChannel(): Channel

/**
* Gets message using the ID. This is a more performatic way to request one message than request the whole list
* Gets message using the ID. This is a more performant way to request one message than request the whole list
* of messages
*/
public fun getMessageById(id: String): Message?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ import io.getstream.chat.android.models.Reaction
import io.getstream.chat.android.models.ReactionGroup
import io.getstream.chat.android.models.SyncStatus
import io.getstream.chat.android.models.Thread
import io.getstream.chat.android.models.ThreadInfo
import io.getstream.chat.android.models.ThreadParticipant
import io.getstream.chat.android.models.UnreadChannel
import io.getstream.chat.android.models.UnreadChannelByType
Expand Down Expand Up @@ -1004,6 +1005,36 @@ public fun randomThread(
draft = draftMessage,
)

public fun randomThreadInfo(
activeParticipantCount: Int = positiveRandomInt(),
cid: String = randomCID(),
parentMessageId: String = randomString(),
parentMessage: Message = randomMessage(id = parentMessageId),
createdByUserId: String = randomString(),
createdBy: User = randomUser(id = createdByUserId),
participantCount: Int = positiveRandomInt(),
lastMessageAt: Date = randomDate(),
createdAt: Date = randomDate(),
updatedAt: Date = randomDate(),
deletedAt: Date? = randomDateOrNull(),
replyCount: Int = positiveRandomInt(),
title: String = randomString(),
): ThreadInfo = ThreadInfo(
activeParticipantCount = activeParticipantCount,
cid = cid,
parentMessageId = parentMessageId,
parentMessage = parentMessage,
createdByUserId = createdByUserId,
createdBy = createdBy,
participantCount = participantCount,
lastMessageAt = lastMessageAt,
createdAt = createdAt,
updatedAt = updatedAt,
deletedAt = deletedAt,
replyCount = replyCount,
title = title,
)

public fun randomAppSettings(
app: App = randomApp(),
): AppSettings = AppSettings(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,6 @@ internal fun MarkAllReadEvent.toChannelUserRead() = ChannelUserRead(
lastReceivedEventDate = createdAt,
lastRead = createdAt,
unreadMessages = 0,
// TODO: Backend should send us the last read message id
// MarkAllReadEvent does not provide last read message ID because it is a global event
lastReadMessageId = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ public fun ChatClient.loadOlderMessages(cid: String, messageLimit: Int): Call<Ch
is Result.Success -> {
val (channelType, channelId) = cid.cidToTypeAndId()
logic.channel(channelType = channelType, channelId = channelId)
.loadOlderMessages(messageLimit = messageLimit)
.loadBefore(messageId = null, limit = messageLimit)
}
is Result.Failure -> cidValidationResult
}
Expand All @@ -355,7 +355,7 @@ public fun ChatClient.loadNewerMessages(
is Result.Success -> {
val (channelType, channelId) = channelCid.cidToTypeAndId()
logic.channel(channelType = channelType, channelId = channelId)
.loadNewerMessages(messageId = baseMessageId, limit = messageLimit)
.loadAfter(messageId = baseMessageId, limit = messageLimit)
}
is Result.Failure -> cidValidationResult
}
Expand All @@ -380,7 +380,7 @@ public fun ChatClient.loadMessagesAroundId(
is Result.Success -> {
val (channelType, channelId) = cid.cidToTypeAndId()
logic.channel(channelType = channelType, channelId = channelId)
.loadMessagesAroundId(messageId)
.loadAround(messageId)
}
is Result.Failure -> cidValidationResult
}
Expand Down Expand Up @@ -474,7 +474,7 @@ private suspend fun ChatClient.loadMessageByIdInternal(

val (channelType, channelId) = cid.cidToTypeAndId()
val result = logic.channel(channelType = channelType, channelId = channelId)
.loadMessagesAroundId(messageId)
.loadAround(messageId)

return when (result) {
is Result.Success -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ internal class EditMessageListenerState(
val isOnline = clientState.isNetworkAvailable
val messageToEdit = message.updateMessageOnlineState(isOnline)

logic.channelFromMessage(messageToEdit)?.stateLogic()?.upsertMessage(messageToEdit)
logic.channelFromMessage(messageToEdit)?.stateLogic?.upsertMessage(messageToEdit)
logic.getActiveQueryThreadsLogic().forEach { it.upsertMessage(messageToEdit) }
logic.threadFromMessage(messageToEdit)?.stateLogic()?.upsertMessage(messageToEdit)
}
Expand All @@ -62,7 +62,7 @@ internal class EditMessageListenerState(
is Result.Failure -> originalMessage.updateFailedMessage(result.value)
}

logic.channelFromMessage(parsedMessage)?.stateLogic()?.upsertMessage(parsedMessage)
logic.channelFromMessage(parsedMessage)?.stateLogic?.upsertMessage(parsedMessage)
logic.getActiveQueryThreadsLogic().forEach { it.upsertMessage(parsedMessage) }
logic.threadFromMessage(parsedMessage)?.stateLogic()?.upsertMessage(parsedMessage)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ internal class HideChannelListenerState(private val logic: LogicRegistry) : Hide
* @param clearHistory Boolean, if you want to clear the history of this channel or not.
*/
override suspend fun onHideChannelRequest(channelType: String, channelId: String, clearHistory: Boolean) {
logic.channel(channelType, channelId).stateLogic().toggleHidden(true)
logic.channel(channelType, channelId).stateLogic.setHidden(true)
}

/**
Expand All @@ -71,7 +71,7 @@ internal class HideChannelListenerState(private val logic: LogicRegistry) : Hide
channelId: String,
clearHistory: Boolean,
) {
val channelStateLogic = logic.channel(channelType, channelId).stateLogic()
val channelStateLogic = logic.channel(channelType, channelId).stateLogic
when (result) {
is Result.Success -> {
if (clearHistory) {
Expand All @@ -82,7 +82,7 @@ internal class HideChannelListenerState(private val logic: LogicRegistry) : Hide
}
}
}
is Result.Failure -> channelStateLogic.toggleHidden(false)
is Result.Failure -> channelStateLogic.setHidden(false)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ internal class PushPreferencesListenerState(private val logic: LogicRegistry) :
private fun updateChannelPushPreference(cid: String, pushPreference: PushPreference) {
val (type, id) = cid.cidToTypeAndId()
logic.channel(type, id)
.stateLogic()
.stateLogic
.updateChannelData { data ->
data?.copy(pushPreference = pushPreference)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,6 @@ internal class QueryChannelListenerState(private val logic: LogicRegistry) : Que
"[onQueryChannelResult] cid: $channelType:$channelId, " +
"request: $request, result: ${result.stringify { it.cid }}"
}
val channelStateLogic = logic.channel(channelType, channelId).stateLogic()

result.onSuccess { channel -> channelStateLogic.propagateChannelQuery(channel, request) }
.onError(channelStateLogic::propagateQueryError)
logic.channel(channelType, channelId).onQueryChannelResult(request, result)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ internal class SendGiphyListenerState(private val logic: LogicRegistry) : SendGi
override fun onGiphySendResult(cid: String, result: Result<Message>) {
if (result is Result.Success) {
val message = result.value
logic.channelFromMessage(message)?.stateLogic()?.upsertMessage(message)
logic.channelFromMessage(message)?.stateLogic?.upsertMessage(message)
logic.getActiveQueryThreadsLogic().forEach { it.upsertMessage(message) }
logic.threadFromMessage(message)?.stateLogic()?.upsertMessage(message)
}
Expand Down
Loading
Loading