Common changes for all artifacts
✅ Added
- Added support for several languages:
- French
- Hindi
- Italian
- Japanese
- Korean
- Spanish
You can disable them by explicitly settingresConfigs
insidebuild.gradle
file. Check our docs for further details.
⚠️ Changed
- 🚨 Breaking change: Firebase dependencies have been extracted from our SDK. If you want to continue working with Firebase Push Notification you need to add
stream-chat-android-pushprovider-firebase
artifact to your App
Check our docs for further details. - Updated the Kotlin version to latest supported -
1.5.21
.
stream-chat-android
🐞 Fixed
- Fixed markdown links rendering using custom linkify implementation.
stream-chat-android-client
✅ Added
PushMessage
class created to store Push Notification dataPushDeviceGenerator
interface to obtain the Push Token and create theDevice
⚠️ Changed
Device
class has an extra attribute with thePushProvider
used on this device- Breaking change:
ChatClient.setDevice()
andChatClient.addDevice()
now receive adevice
instance, instead of only receive the push provider token RemoteMessage
from Firebase is not used anymore inside of our SDK, now it needs to be used withPushMessage
classNotificationConfig
has a new list ofPushDeviceGenerator
instance to be used for generating the Push Notification Token. If you were usingFirebase
as your Push Notification Provider, you need to addFirebasePushDeviceGenerator
to yourNotificationConfig
object to continue working as before.FirebasePushDeviceGenerator
receive by constructor the defaultFirebaseMessaging
instance to be used, if you would like to use your own instance and no the default one, you can inject it by constructor. Unneeded Firebase properties have been removed from this class.
❌ Removed
- 🚨 Breaking change: Remove
ChatClient.isValidRemoteMessage()
method. It needs to be handled outside - 🚨 Breaking change: Remove
ChatClient.handleRemoteMessage(RemoteMessage)
. Now it needs to be usedChatClient.handlePushMessage(PushMessage)
stream-chat-android-offline
🐞 Fixed
- Fixed the event sync process when connection is recovered
stream-chat-android-ui-common
❌ Removed
- Removed unnecessary "draft" filter from the default channel list filter as it is only relevant to the sample app
stream-chat-android-ui-components
🐞 Fixed
- Fixed attachments of camera. Now multiple videos and pictures can be taken from the camera.
- Added the possibility to force light and dark theme. Set it in inside ChatUI to make all views, fragments and activity of the SDK light.
- Fixed applying style to
SuggestionListView
when using it as a standalone component. You can modify the style usingsuggestionListViewTheme
orTransformStyle::suggestionListStyleTransformer
- Fixed markdown links rendering using custom linkify implementation.
✅ Added
- Added
MessageListView::setDeletedMessageListItemPredicate
function. It's responsible for adjusting visibility of the deletedMessageListItem.MessageItem
elements. - Added
streamUiAttachmentSelectionBackgroundColor
for configuring attachment's icon background inAttachmentSelectionDialogFragment
- Added
streamUiAttachmentSelectionAttachIcon
for configuring attach icon inAttachmentSelectionDialogFragment
- Added support for pinned messages:
- Added a button to pin/unpin a message to the message options overlay
- Added
MessageListView::setMessagePinHandler
andMessageListView::setMessageUnpinHandler
methods to provide custom handlers for aforementioned button - Added
PinnedMessageListView
to display a list of pinned messages. The view is supposed to be used withPinnedMessageListViewModel
andPinnedMessageListViewModelFactory
- Possibility to transform MessageItems before the are displayed in the screen.
Use theMessageListView.setMessageItemTransformer
for make the necessary transformation. This example makes groups of messages if they were created less than one hour apart:
binding.messageListView.setMessageItemTransformer { list ->
list.mapIndexed { i, messageItem ->
var newMessageItem = messageItem
if (i < list.lastIndex) {
val nextMessageItem = list[i + 1]
if (messageItem is MessageListItem.MessageItem &&
nextMessageItem is MessageListItem.MessageItem
) {
val thisInstant = messageItem.message.createdAt?.time?.let(Instant::ofEpochMilli)
val nextInstant = nextMessageItem.message.createdAt?.time?.let(Instant::ofEpochMilli)
if (nextInstant?.isAfter(thisInstant?.plus(1, ChronoUnit.HOURS)) == true) {
newMessageItem = messageItem.copy(positions = listOf(MessageListItem.Position.BOTTOM))
} else {
newMessageItem =
messageItem.copy(positions = messageItem.positions - MessageListItem.Position.BOTTOM)
}
}
}
newMessageItem
}
}
- Added possibility to customize the appearance of pinned message in the
MessageListView
using the following attributes:streamUiPinMessageEnabled
- attribute to enable/disable "pin message" featurestreamUiPinOptionIcon
- icon for pin message optionstreamUiUnpinOptionIcon
- icon for unpin message optionstreamUiPinnedMessageIndicatorTextSize
,streamUiPinnedMessageIndicatorTextColor
,streamUiPinnedMessageIndicatorTextFontAssets
,streamUiPinnedMessageIndicatorTextFont
,streamUiPinnedMessageIndicatorTextStyle
attributes to customize "pinned by" textstreamUiPinnedMessageIndicatorIcon
- icon in the message list indicating that a message was pinnedstreamUiPinnedMessageBackgroundColor
- the background color of a pinned message in the message list
- Added possibility to customize
PinnedMessageListView
style usingstreamUiPinnedMessageListStyle
theme attribute orTransformStyle.pinnedMessageListViewStyleTransformer
. The list of available style attributes can be found inattrs_pinned_message_list_view.xml
. The default style forPinnedMessageListView
isStreamUi.PinnedMessageList
.
⚠️ Changed
- 🚨 Breaking change: the deleted
MessageListItem.MessageItem
elements are now displayed by default to all the users. This default behavior can be customized usingMessageListView::setDeletedMessageListItemPredicate
function. This function takes an instance ofMessageListItemPredicate
. You can pass one of the following objects:DeletedMessageListItemPredicate.VisibleToEveryone
DeletedMessageListItemPredicate.NotVisibleToAnyone
- or
DeletedMessageListItemPredicate.VisibleToAuthorOnly
Alternatively you can pass your custom implementation by implementing theMessageListItemPredicate
interface if you need to customize it more deeply.
stream-chat-android-compose
🐞 Fixed
- Fixed a bug where we didn't use the
Channel.getDisplayName()
logic for theMessageListHeader
. - Fixed a bug where lazy loading for
Channel
s wasn't working consistently
⬆️ Improved
- Updated Jetpack Compose to
1.0.1
- Updated Accompanist libraries to
0.16.1
- Updated KTX Activity to
1.3.1
- Exposed functionality for getting the
displayName
ofChannel
s. - Added updated logic to Link preview attachments, which chooses either the
titleLink
or theogUrl
when loading the data, depending on which exists .
✅ Added
- Added the
emptyContent
andloadingContent
parameters toChannelList
andMessageList
components. Now you can customize the UI of those two states. - Added lots of improvements to Avatars - added a
UserAvatar
,ChannelAvatar
and anInitialsAvatar
to load different types of data. - We now show a matrix of user images in case we're in a group DM.
- We also show initials in case the user doesn't have an image.
- Added a way to customize the leading content in the
ChannelListHeader
.
⚠️ Changed
ViewModel
s now initialize automatically, so you no longer have to callstart()
on them. This is aimed to improve the consistency between our SDKs.- Added a
Shape
parameter toAvatar
to customize the shape. - The
User
parameter in theChannelListHeader
is nullable and used to display the default leading content.
stream-chat-android-pushprovider-firebase
✅ Added
- Create this new artifact. To use Firebase Push Notification you need do the following steps:
- Add the artifact to your
build.gradle
file ->implementation "io.getstream:stream-chat-android-pushprovider-firebase:$streamVersion"
- Add
FirebaseDeviceGenerator
to yourNotificationConfig
val notificationConfig = NotificationConfig( [...] pushDeviceGenerators = listOf(FirebasePushDeviceGenerator()) )
- Add the artifact to your