- Added new properties in
Reaction
to support more users
class Reaction {
// A list of sampled userIds that have reacted to this Reaction.
val sampledUserIds: List<String>
// A count of the number of users who have reacted to this.
var count: Long
// A flag indicating whether the current user has reacted to this.
var hasCurrentUserReacted: Boolean
}
- Improved speed of
GroupChannelCollection.loadMore()
when theGroupChannelListQuery
is set with filters.
- Fixed a crash issue due to lack of proguard rule for
PublicSuffixDatabase
in the okhttp library.
- Fixed a bug where non-operator's message affects the last message and the unread message count for exclusive channels
- Fixed a bug where a channel gets unexpectedly unhidden upon receiving a new message.
- Added
useDnsFallback
toInitParams
which enables a fallback where a second DNS lookup is attempted using a public DNS when the initial lookup using the system DNS fails. Its default value isfalse
.
- Improved speed of
MessageCollection.initialize()
when there are lots of reply messages in the channel.
- Added interfaces for
MessageForm
to work with Sendbird dashboard andForm
interfaces have been deprecated.- Added
submitMessageForm(CompletionHandler?)
method inBaseMessage
class - Added
messageForm
property inBaseMessage
class - Added
MessageForm
class - Added
MessageFormItem
class - Added
MessageFormItem.Style
class - Added
MessageFormItem.LayoutType
enum - Added
MessageFormItem.ResultCount
enum - Deprecated
submitForm(Form, CompletionHandler)
method inBaseMessage
class - Deprecated
forms
property inBaseMessage
class - Deprecated
Form
class and interfaces - Deprecated
FormField
class and interfaces - Deprecated
FormFieldAnswer
class and interfaces
- Added
- Added
TemplateContainerOptions
inTemplateMessageData
- Added
SendbirdChat.getUnreadItemCount(GroupChannelUnreadItemCountParams, GroupChannelGetUnreadItemCountHandler?)
method to support filtering unread message count by custom types- Added
GroupChannelUnreadItemCountParams
class - Deprecated existing
SendbirdChat.getUnreadItemCount(Collection<UnreadItemKey>, GroupChannelGetUnreadItemCountHandler)
method
- Added
- Fixed an occasional
ConcurrentModificationException
crash fromBaseMessageCollection.getPendingMessages
.
Support pinned message
in OpenChannel
- Added
pinnedMessageIds
property toBaseChannel
- Added
lastPinnedMessage
property toBaseChannel
- Added
pinMessage
method toBaseChannel
- Added
unpinMessage
method toBaseChannel
- Added
onPinnedMessageUpdated
toOpenChannelHandler
- Expanded
SendbirdChat.createPinnedMessageListQuery
to use inOpenChannel
- Added
SendbirdChat.authenticate()
for authentication- Deprecated
SendbirdChat.authenticateFeed()
- Deprecated
- Added
SendbirdChat.getTotalUnreadNotificationCount()
to get the total unread notification count of a user
- Added
SendbirdPushHelper.registerHandler()
- Deprecated
SendbirdPushHelper.registerPushHandler()
- Deprecated
- Added
SendbirdPushHelper.unregisterHandler(Boolean, PushRequestCompleteHandler?)
- Deprecated
SendbirdPushHelper.unregisterPushHandler(PushRequestCompleteHandler?)
- Deprecated
SendbirdPushHelper.unregisterPushHandler(Boolean, PushRequestCompleteHandler?)
- Deprecated
- Added
collectionLifecycle
inGroupChannelCollection
,MessageCollection
andNotificationCollection
- Added new properties
hasAiBot
andhasBot
toGroupChannel
- Fixed an occasional
ConcurrentModificationException
crash fromreconnect()
- Improved
SendbirdChat.init()
to prevent possible ANR during the init process
- Improved stability.
You can mark push notifications as clicked within the SDK, tracking the push notification clicked rate.
-
Added
markPushNotificationAsClicked(Map<String, String>, CompletionHandler)
inSendbirdPushHelper
SendbirdPushHelper.markPushNotificationAsClicked(pushData)
-
Added
logViewed(List<BaseMessage>)
,logClicked(BaseMessage)
inFeedChannel
-
Deprecated
logImpression(List<BaseMessage>)
inFeedChannel
Added MessageTemplate
feature for UIKit to render messages with templates.
- Added
messageTemplateInfo
property toAppInfo
. - Added
SendbirdChat.getMessageTemplate(String, MessageTemplateHandler?)
. - Added
SendbirdChat.getMessageTemplatesByToken(String, MessageTemplateParams(), MessageTemplatesResultHandler?)
. - Added
MessageTemplateHandler
andMessageTemplatesResultHandler
. - Added models for message templates,
MessageTemplate
,MessageTemplateInfo
,MessageTemplatesResult
andMessageTemplateListParams
.
- Added
EventDetail
inGroupChannelContext
/FeedChannelContext
to hold detailed information of channel events- i.e. Getting an inviter/invitees information when a channel has been added from receiving an invitation:
override fun onChannelsAdded(context: GroupChannelContext, channels: List<GroupChannel>) { if (context.eventDetail is EventDetail.OnUserReceivedInvitation) { val inviter: User? = context.eventDetail.inviter val invitees: List<User> = context.eventDetail.invitees } }
- i.e. Getting an inviter/invitees information when a channel has been added from receiving an invitation:
- Fixed
DateTimeException
occurring fromSendbirdChat.init()
in some devices
- Removed
ThreadedParentMessageListQuery
and related interfaces released inv4.15.4
- Added
ThreadedParentMessageListQuery
class GroupChannel {
val totalUnreadReplyCount: Int
fun createThreadedParentMessageListQuery(
params: ThreadedParentMessageListQueryParams
): ThreadedParentMessageListQuery
}
class BaseMessage {
fun markThreadAsRead(handler: CompletionHandler?)
fun setPushNotificationEnabled(enabled: Boolean, handler: CompletionHandler?)
}
class ThreadInfo {
val unreadReplyCount: Int
val memberCount: Int
val isPushNotificationEnabled: Boolean
}
- Improved stability
- Reduced SDK Size by optimizing kotlin function usage
- Added new property
notificationPriority
in BaseMessage - Fixed a bug where
MessageMetaArray
related operation doesn't work withMultipleFilesMessage
- The SDK version 4.15.1 has been deprecated because it has been released by mistake. DO NOT USE THIS VERSION.
- Supports new SendbirdChat KTX
- Fixed a bug where
NotificationCollectionHandler.onMessagesUpdated()
is called indefinitely in some cases
- Fix intermittent
ConcurrentModificationException
inMessageCollection
- Three new features related to Generative AI have been added: Form type, Suggested replies and Feedback.
- Form type: A form type message is a message that contains a form. A form is a set of questions that a user can answer to collect data from users.
- How to determine if a message is a form type message:
val BaseMessage.isFormTypeMessage: Boolean get() = this.forms.isNotEmpty()
- How to save the answer in the SDK when the user enters input:
editText.addTextChangedListener( object : TextWatcher { ... override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { formField.temporaryAnswer = Answer(formField.key, s.toString()) } } )
- Submits a form
// submits form message.submitForm(form) { e -> if (e != null) { // handle error } } // The submitted form is updated through a message update event. SendbirdChat.addChannelHandler( "IDENTIFIER", object : GroupChannelHandler() { ... override fun onMessageUpdated(channel: BaseChannel, message: BaseMessage) { message.forms.find { it.formKey == "TARGET_FORM_KEY" }?.isSubmitted // should be true // update message UI to submitted form } } )
- How to determine if a message is a form type message:
- Suggested replies: Suggested reply is a set of items that a user can click quickly to send a message. Suggested replies is contained in a last message.
SendbirdChat.addChannelHandler( "IDENTIFIER", object : GroupChannelHandler() { ... override fun onChannelChanged(channel: BaseChannel) { if (channel is GroupChannel) { val suggestedReplies = channel.lastMessage?.suggestedReplies if (!suggestedReplies.isNullOrEmpty()) { // draw suggested replies for the channel's last message } } } } )
- Feedback: Feedback is a feature that allows users to provide their satisfaction or dissatisfaction with the bot's responses.
- How to draw feedback UI
val feedback = message.myFeedback when (message.myFeedbackStatus) { FeedbackStatus.NOT_APPLICABLE -> { // this message is not applicable for feedback // Make thumbs-up/down UI invisible or disable here // `feedback` should be null } FeedbackStatus.NO_FEEDBACK -> { // The feedback is not submitted yet but user can submit feedback // Make thumbs-up/down UI visible or enable without being selected // `feedback` should be null } FeedbackStatus.SUBMITTED -> { // The feedback is submitted // Make thumbs-up/down UI visible or enable as selected // `feedback` should not be null } }
- How to submit / update / delete feedback
// submit feedback message.submitFeedback(FeedbackRating.Good) { feedback, e -> when { feedback != null -> { // update feedback UI } e != null -> { // handle error } } } // update feedback message.updateFeedback(FeedbackRating.Good, "Very good response") { feedback, e -> when { feedback != null -> { // update feedback UI } e != null -> { // handle error } } } // delete feedback message.deleteFeedback { e -> // handle error }
- How to draw feedback UI
- Form type: A form type message is a message that contains a form. A form is a set of questions that a user can answer to collect data from users.
- Introduced
BaseMessage.extras
to enable developers to include their own data inBaseMessage
and carry it seamlessly. - Added
logCustom(String, List<BaseMessage>)
inFeedChannel
.
- Fix the bug where the internal network status flag is incorrect when an app starts from offline mode.
-
Added new read-only attribute
messageReviewInfo
inUserMessage
class UserMessage { // exist only if the message is in review or it has been approved val messageReviewInfo: MessageReviewInfo? } class MessageReviewInfo { val status: MessageReviewStatus val originalMessageInfo: OriginalMessageInfo? // (exist only if the status is approved) } enum class MessageReviewStatus { IN_REVIEW, APPROVED } class OriginalMessageInfo { val createdAt: Long val messageId: Long }
-
Added new read-only attribute
notificationMessageStatus
inBaseMessage
-
Added
markAsRead(List<BaseMessage>, CompletionHandler?)
inFeedChannel
-
Added
logImpression(List<BaseMessage>)
inFeedChannel
class BaseMessage { // This value represents the status value for the Notification message. The value `NONE` is returned for messages that are not Notification messages. val notificationMessageStatus: NotificationMessageStatus } enum class NotificationMessageStatus(val value: String) { NONE, SENT, READ }
- Mitigated an ANR issue by lazy creation of properties within
SendbirdChat.init()
- Reduced delay in
GroupChannelCollection.loadMore()
when there's lots of channels
- Added
GroupChannel.getDeliveryStatus(Boolean): Map<String, DeliveryStatus>
to get delivery status of all members. - Added
BaseMessage.submitForm(String, Map<String, String>, CompletionHandler?)
, which allows you to submit form messages sent by the bot. Please note that form messages are delivered via BaseMessage.extendedMessages when all settings are properly configured on the server.
- Fixed occasional
NoSuchElementException
when accessingGroupChannel.members
.
- Improved stability.
You can get the categories of a set FeedChannel and the channel's properties from the Dashboard.
- Added
isCategoryFilterEnabled
,isTemplateLabelEnabled
, andnotificationCategories
in FeedChannel
var isCategoryFilterEnabled: Boolean
var isTemplateLabelEnabled: Boolean
var notificationCategories: List<NotificationCategory>
You can obtain the data that you set when you send Notification to the template that you created in the dashboard.
- Added
notificationData
inBaseMessage
val notificationData: NotificationData?
- Added
enableAutoResend
inInitParams.LocalCacheConfig
to control auto-resending feature when local cache is enabled - Added
isBot
inSender
- Added
file
,url
getters inUploadableFileInfo
- Mitigated an ANR issue and a failure of initialization by reducing access to SharedPreferences in the main thread
- Added 'SendbirdChat.authenticateFeed' for Sendbird Notifications
- Added 'SendbirdChat.refreshNotificationCollections' for Sendbird Notifications
- Added
createdBefore
andcreatedAfter
in listingGroupChannels
.
class GroupChannelListQueryParams {
var createdBefore: Long? = null
var createdAfter: Long? = null
}
class GroupChannelListQuery {
val createdBefore: Long? = params.createdBefore
val createdAfter: Long? = params.createdAfter
}
class PublicGroupChannelListQueryParams {
var createdBefore: Long? = null
var createdAfter: Long? = null
}
class PublicGroupChannelListQuery {
val createdBefore: Long? = params.createdBefore
val createdAfter: Long? = params.createdAfter
}
You can mark push notifications as delivered within the SDK, tracking delivery status.
- Added
SendbirdPushHelper.markPushNotificationAsDelivered
.
SendbirdPushHelper.markPushNotificationAsDelivered(pushData)
- Added
GroupChannel.resendMessage(MultipleFilesMessage, FileUploadHandler?, MultipleFilesMessageHandler?): MultipleFilesMessage?
,GroupChannel.copyMultipleFilesMessage(BaseChannel, MultipleFilesMessage, MultipleFilesMessageHandler?): MultipleFilesMessage?
. - Fixed a bug where the group channel changelogs did not update the group channel metadata.
- Fixed a bug where the changes of the *chat history setting were not reflected properly when the local cache is turned on.
*(Chat history setting can be found in Dashboard page - Settings - Channels - Chat history)
- Fixed a bug that was occurring when ProGuard was enabled. The issue prevented the function MessageCollection.onMessageAdded from being called for pending messages in FileMessage or MultipleFileMessage.
- Fixed a bug that MessageCollection.onMessageAdded is not called for a pending message of FileMessage or MultipleFileMessage
- Fixed the bug where the notification-related stats disappear when the app is restarted.
- Fixed a security flaw related to the connection
- Fixed a crash that occurred when sqlcipher was used alongside proguard.
- Fixed a randomly occurring ConcurrentModificationException.
- Introduced new error codes to streamline error handling:
- SendbirdError.ERR_INITIALIZATION_CANCELED: Triggered when SDK initialization exceeds 5 seconds to prevent App Not Responding (ANR) incidents.
- SendbirdError.ERR_DATABASE_ERROR_ENCRYPTION: Related to issues with sqlcipher, such as an undeclared sqlcipher dependency or an incorrect encryption key.
You can send a MultipleFilesMessage
that contains multiple files in a single message via GroupChannel.sendMultileFilesMessage()
- Added
MultipleFilesMessage
. - Added
GroupChannel.sendMultipleFilesMessage
,MultipleFilesMessageCreateParams
,UploadableFileInfo
andUploadedFileInfo
. - Added
MultipleFilesMessageHandler
andFileUploadhandler
. - Added
SendbirdChat.multipleFilesMessageFileCountLimit
that indicates the maximum count of files that can be included in a single message.
val params = MultipleFilesMessageCreateParams(
listOf(
UploadableFileInfo(file),
UploadableFileInfo(fileUrl)
)
)
channel.sendMultipleFilesMessage(
params,
fileUploadHandler = { requestId, index, uploadableFileInfo, e ->
// handle the upload result of each UploadableFileInfo.
},
multipleFilesMessageHandler = { message, e ->
// handle the result of sending MultipleFilesMessage.
}
)
- Fixed SendbirdChat.Connect callback not being called when Sendbird.connect and GroupChannel.GetChannel are called simultaneously
- Improved speed of initialization to reduce initialization timeout
- Improved stability
- Fixed a crash from SendbirdChat.init caused by android.net.ConnectivityManager$TooManyRequestsException
- Fixed an issue that ConnectHandler.onConnected is not called sometimes when the app is in offline
- Supports 'includeParentInfo' for the PinnedMessageListQuery
You can now retrieve all pinned messages within a GroupChannel by the PinnedMessageListQuery
.
- Added
PinnedMessage
- Added
PinnedMessageListQuery
,PinnedMessageListQueryParams
- Added
SendbirdChat.createPinnedMessageListQuery
val params = PinnedMessageListQueryParams(channel.channelType, channel.url)
val query = SendbirdChat.createPinnedMessageListQuery(params)
query.next { pinnedMessages, e ->
// handle result
}
- Fixed possible ANR in
GroupChannelCollection.dispose()
pendingPushToken is deprecated. Retrieve most recent token through the push library instead.
SendbirdChat.pendingPushToken
SendbirdChat.HMS.pendingPushToken
You can now automatically detect when a muted user is unmuted by leveraging MessageCollection
.
Clients will now receive MessageCollectionHandler.onChannelUpdated()
with GroupChannelContext.CollectionEventSource.EVENT_USER_UNMUTED
when an user is unmuted after their muted duration has expired, on top of explict unmute calls. This now means that you can easily transition user’s experience and allow them to chat even more seamlessly.
Note that this is a MessageCollections only feature! We recommend all of our clients to give it a try if you haven’t : )
- Added OpenChannelCreateParams.isEphemeral
- Fixed an issue where network wouldn't properly reconnect when
connect()
is called again with a different user id - Fixed potential ANR from
SendbirdChat.init()
You can now control the size of your local cache. Starting from 64mb, decide how much you want to store (Default: 256mb).
Once the size limit is reached, the SDK will automatically remove messages and channels with pre-specified logic (clearOrder
) so that you don't have to actively manage it.
- Added DB size related properties in
LocalCacheConfig
LocalCacheConfig().apply {
maxSize = 256
clearOrder = CachedDataClearOrder.MESSAGE_COLLECTION_ACCESSED_AT
}
- Added
SendbirdChat.getTotalUnreadMessageCount(GroupChannelTotalUnreadMessageCountParams, UnreadMessageCountHandler?)
- Deprecated
SendbirdChat.getTotalUnreadMessageCount(GroupChannelTotalUnreadMessageCountParams, CountHandler?)
- Deprecated
- Added
UserEventHandler.onTotalUnreadMessageCountChanged(UnreadMessageCount)
- Deprecated
UserEventHandler.onTotalUnreadMessageCountChanged(Int, Map<String, Int>)
- Deprecated
Locally saved chats in your user's device can now be encrypted using SQLCipher, a popular database encryption library. As for exact how-to, please refer to below guide and API Reference.
Note that this is an external 3rd party library and is not endorsed by Sendbird. The client must bring their own SQLCipher license and manage their encryption key
- You must declare SQLCipher dependencies to use the encryption feature. Please refer SQLCipher's documentation to see how you can declare the SQLCipher dependencies.
- Create
InitParams
and then setLocalCacheConfig
andSqlcipherConfig
. These options are turned off by default, so you don't have to set anything up if you don't intend to use them.
InitParams(APP_ID, Context, useCaching = true).apply {
localCacheConfig = LocalCacheConfig().apply {
sqlCipherConfig = SqlcipherConfig(ENCRYPTION_KEY)
}
}
- Call SendbirdChat.init with the
InitParams
InitParams.localCacheConfig
LocalCacheConfig.sqlcipherConfig
SqlcipherConfig(password, licenseCode)
Polls is now supported in both Open Channels and Group Channels!
- Added
onPollUpdated
,onPollVoted
, andonPollDeleted
inOpenChannelHandlerParams
- Moved following methods from
GroupChannel
toBaseChannel
:updatePoll()
deletePoll()
closePoll()
addPollOption()
updatePollOption()
deletePollOption()
votePoll()
getPollChangeLogsSinceTimestamp()
getPollChangeLogsSinceToken()
createPollListQuery()
createPollVoterListQuery()
- Fixed a bug where
GroupChannelFilter
using nicknames (nicknameContainsFilter
,nicknameExactMatchFilter
, andnicknameExactMatchFilter
) includes current user's nickname when searching from locally cached group channels. - Fixed
ConcurrentModificationException
fromGroupChannelCollection.channelList
- Fixed a bug where
SendbirdChat.markAsDelivered()
fails when it's called on receiving a push notification when the app is in killed state.
When you call SendbirdChat.disconnect
, it disconnects the WebSocket and clears local cache. You can think of it as logging out.
In some cases, you need to only disconnect the WebSocket. You can now do it by calling SendbirdChat.disconnectWebSocket
.
It only disconnects the WebSocket and preserves the local cache.
SendbirdChat.disconnectWebSocket {
// onDisconnected
}
To connect again after disconnecting with disconnectWebSocket()
,
use SendbirdChat.connect().
SendbirdChat.connect(userId) { user, e ->
if (user != null) {
// onConnected
} else {
// Handle error.
}
}
- Added
SendbirdChat.isInitialized
which indicates whether the SDK is initialized or not- If the SDK is initialized with
InitParams.useCaching
is set to true, this will be true only after the asynchronousInitResultHandler.onInitSucceed()
is called
- If the SDK is initialized with
- Fixed bug where
Poll.votedPollOptionIds
is not properly updated when a poll option is deleted - Added default arguments for following functions. You can now call these functions without the
Params
argumentsBaseChannel.getMessageChangeLogsSinceTimestamp
BaseChannel.getMessageChangeLogsSinceToken
SendbirdChat.getMyGroupChannelChangeLogsByTimestamp
SendbirdChat.getMyGroupChannelChangeLogsByToken
Participant class in Open Channel
Participant is a new interface for User who joined Open Channel. It's optimized for scalability and contains much lighter information about the User than a Member in Group Channel. Now clients can implement Open Channels easier in SDK with more built-in capabilities. You can compare how Member, Participant, and User are different here
Participant
holds essential information about the participant like below. They contain their muted status (is_muted
) on top of basic User information
class Participant : User {
val isMuted: Boolean
fun serialize(): ByteArray
companion object {
fun buildFromSerializedData(data: ByteArray?): Participant?
}
}
ParticipantListQuery.next(UsersHandler)
now returnsList<Participant>
- For backward compatibility, the
UsersHandler
returnsUser
list, but it can be casted intoParticipant
- For backward compatibility, the
You can now set longer timeout value (Previously 10s) for session token expiry. (Default: 60s, Maximum: 1800s). This means that Sendbird SDK will wait longer for your new session token, making it easier for you to reconnect to our service.
SendbirdChat.Options.setSessionTokenRefreshTimeout(Int)
- Fixed bug where
BaseChannelHandler.onChannelChanged
andGroupChannelHandler.onPinnedMessageUpdated
are not being called when the pinned message is updated
- Fixed possible ANR in
SendbirdChat.init()
Pinned Message is released. You can now maintain a special set of messages (up to 10 per channel) that you want everyone in the channel to share. It can be anything from announcements, surveys, upcoming events, and any many more. Pin your messages and never miss them! Stay tuned for updates as we are rolling out more exciting features and see below for exact specifications:point_down:
- Pin when sending a message
UserMessageCreateParams.isPinnedMessage: Boolean = false
FileMessageCreateParams.isPinnedMessage: Boolean = false
- Pin existing message
GroupChannel.pinMessage(Long, CompletionHandler?)
- Unpin a message
GroupChannel.unpinMessage(Long, CompletionHandler?)
- Pinned messages
GroupChannel.lastPinnedMessage: BaseMessage? = null
GroupChannel.pinnedMessageIds: List<Long> = emptyList()
We strongly recommend using Collections (Message, Channel) to implement Pinned Messages as it would automatically take care of numerous events out of the box when messages are created, updated, and deleted.
- Fixed
ConcurrentModificationException
fromVersioningCache.toString()
- Added message filtering in
pendingMessages
andfailedMessages
of aMessageCollection
using theMessageListParams
- Removed
isAnonymous
flag from Poll related interfacesPoll.isAnonymous
PollCreateParams.isAnonymous
PollUpdateParams.isAnonymous
- Fixed pending message not being delivered by
MessageCollectionHandler.onMessagesAdded()
when sending a user message on an app built with Proguard on. - Fixed crash when printing
CustomizableMessage.toString()
- Fixed
ConcurrentModificationException
fromOpenChannel.toString()
- Fixed MessageCollectionHandler.onMessagesUpdated() not being fired when sending a FILE message on an app built with Proguard on.
- Changed constructor of PollData to public.
Polls is released 🎉 Here’s where we think it will be really powerful.
- Collect feedback and customer satisfaction
- Drive engagement by receiving participants in preferences
- Run surveys and quiz shows
- And many more!
Scheduled messages is released 🎊 Here’s where we think it will be really useful.
- Let your users queue their messages for the future
- Set helpful reminders and notifications to nudge certain actions
- And many more!
- Fixed a bug where mentioned users are not cleared from a message when updating with an empty
BaseMessageUpdateParams.mentionedUsers
orBaseMessageUpdateParams.mentionedUserIds
- Fixed a
RejectedExecutionException
when receiving an event inConnectionStateManager.onEvent()
- Fixed a crash when
SendbirdChat.connect()
is called with an invalid API/WS hosts
Please note that both Polls and Scheduled Messages are released as beta features. Thus specific parameters and properties may change to improve client’s overall experience.
Stay tuned for updates as we are rolling out more exciting features and see below for exact specifications 👇
- Create
Poll.create()
PollCreateParams
UserMessageCreateParams.pollId
- Read
Poll.get()
PollRetrievalParams
SendbirdChat.createPollListQuery()
PollListQueryParams
GroupChannel.createPollListQuery()
UserMessage.poll
- Update
GroupChannel.updatePoll()
PollUpdateParams
GroupChannel.closePoll()
- Delete
GroupChannel.deletePoll()
- Others:
Poll
GroupChannel.getPollChangeLogsSinceTimestamp()
GroupChannel.getPollChangeLogsSinceToken()
PollData
GroupChannelHandler.onPollUpdated()
GroupChannelHandler.onPollDeleted()
- Create
PollCreateParams.optionTexts
GroupChannel.addPollOption()
- Read
PollOption.get()
PollOptionRetrievalParams
SendbirdChat.createPollVoterListQuery()
PollVoterListQueryParams
GroupChannel.createPollVoterListQuery()
- Update
GroupChannel.updatePollOption()
GroupChannel.votePoll()
- Delete
GroupChannel.deletePollOption()
- Others:
PollOption
GroupChannelHandler.onPollVoted()
PollStatus
PollVoteEvent
PollUpdateEvent
CollectionEventSource.EVENT_POLL_UPDATED
CollectionEventSource.EVENT_POLL_VOTED
CollectionEventSource.POLL_CHANGELOG
- Create
GroupChannel.createScheduledUserMessage()
GroupChannel.createScheduledFileMessage()
- Read
ScheduledMessageListQuery
BaseMessage.getScheduledMessage()
ScheduledMessageRetrievalParams
- Update
GroupChannel.updateScheduledUserMessage()
GroupChannel.updateScheduledFileMessage()
- Delete
GroupChannel.cancelScheduledMessage()
- Others
ScheduledInfo
SendingStatus.SCHEDULED
BaseMessage.scheduledInfo
SendbirdChat.getTotalScheduledMessageCount()
TotalScheduledMessageCountParams
- Added
nicknameStartsWithFilter
andnicknameExactMatchFilter
inGroupChannelListQueryParams
- Implemented history of channel membership where clients can now track whether users have joined or left the channel (
MemberState.LEFT
for left members of aGroupChannel
) - Improved thread management to reduce total thread count when deleted
- Fixed a bug where
GroupChannelListQuery.next()
fails due to user ID not being properly encoded in the url
- Added Boolean switch to remove operator status when leaving channels (
GroupChannel.leave(shouldRemoveOperatorStatus: Boolean = false, handler: CompletionHandler)
) - Added MessageSearchQuery's totalCount and made it public (MessageSearchQuery.totalCount)
- Fixed a bug where
onSessionTokenRequired
is not called immediately after session expires
- Improved API reference page's readability
- Modified
MessageCollection
to handle events forchannel.translateUserMessage()
- When a message is translated, it's corresponding event will be delivered by
MessageCollectionHandler.onMessagesUpdated()
withMessageContext.CollectionEventSource.EVENT_MESSAGE_UPDATED
- When a message is translated, it's corresponding event will be delivered by
- Fixed bugs
- Pending message doesn't serialize propery when
UserMessageCreateParams.mentionedUsers
is set with aMember
object - Canceled messages not being removed from the
MessageCollection
- The
requestId
of a pending message differs from the scheduled message (and the actual sent message)
- Pending message doesn't serialize propery when
- Changed
GroupChannel.createScheduledUserMessage
andGroupChannel.createScheduledFileMessage
to return correspondingSendingStatus.PENDING
message object. - Fixed a bug where when reconnected, an updated message gets removed and added again in
MessageCollection
.
- Fixed a bug where both file object and file url in file message gets cleared when serialized/deserialized.
To see detailed changes for below items, please refer to the migration guide
- Codebase has been re-written from Java to Kotlin
- Naming of the main class has been changed from SendBird to SendbirdChat
- Deprecated interfaces from v3 has been removed
- Support for SyncManager has been removed
Improvements
- Added
HiddenChannelFilter.ALL
forGroupChannelListQuery
- Improved exception messages to provide more detail
- SDK log has been refined, now it provides more useful informations such as API request/response based on the LogLevel
- Added
MyMemberStateFilter
GroupChannelListQuery.memberStateFilter
→GroupChannelListQuery.myMemberStateFilter
GroupChannelListQueryParams.memberStateFilter
→GroupChannelListQueryParams.myMemberStateFilter
SendbirdChat.getGroupChannelCount(MemberStateFilter?, CountHandler?)
→SendbirdChat.getGroupChannelCount(MyMemberStateFilter?, CountHandler?)
- Changed all names that include
SendBird
toSendbird
- Changed interfaces to be more kotlin style
- Change getter, setter functions to property access
- From Kotlin side, access properties directly
- From Java side, access by
getSomething()
andsetSomething()
- Prefer List than MutableList
- Specify nullability for return types and parameters
- Change getter, setter functions to property access
- Some parameter classes are separated to create/update parameter class
- i.e.
UserMessageParams
is separated toUserMessageCreateParams
,UserMessageUpdateParams
Renamed
- i.e.
- Unifying callback handlers
- i.e.
com.sendbird.android.BaseChannel.ReportHandler
is replaced bycom.sendbird.android.handler.CompletionHandler
that has same signature
- i.e.
- Namespace of the class has been refined
- Repackage
- i.e.
com.sendbird.android.BaseMessage
→com.sendbird.android.message.BaseMessage
- i.e.
- Moved nested classes to the top level
- i.e.
com.sendbird.android.user.query.UserListQuery.UserListQueryResultHandler
→com.sendbird.android.handler.UserListQueryResultHandler
- i.e.
- Repackage
- Remove all setters for
Query
classes and made query properties immutable- Added corresponding
Params
classes
- Added corresponding
For the changelog between the bete releases, please refer to this page
Please refer to this page