All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Minor improvements to the caching implementation — no behaviour or API changes
- Messaging UI: Fix a bug preventing
ConversationListView
from correctly binding itself to its ViewModel events in case of errors while fetching the data. - Core: Fix a bug leading to new messages and items not being fetched in real time when using
clearCurrentUser
.
- Core: Remove wrong caching of the value returned by
NablaClient.currentUserId
. It will now return the correct up-to-date value.
- Messaging core: Added new
lastMessage
property onConversation
that gives access to the whole message and not just its preview. - Add Portuguese translations
- Messaging: Make the button and the icon in video consultation item respect the container/content color pair.
- Messaging: Fix joining/leaving multi-patients conversations not shown in real-time (but only on refresh).
- Messaging: Fix a rare UI glitch where the spacing between conversations on the
ConversationListView
would be too high.
AuthTokens
now takesAccessToken
andRefreshToken
as parameters to avoid any confusion. The order has been changed too, so you should now callval authTokens = AuthTokens(AccessToken("your access token"), RefreshToken("your refreshToken"))
- Messaging and Scheduling: Messaging core: Watchers will now correctly emit a UserIdNotSet exception if you call clearCurrentUser while still watching them.
- Fix a runtime issue with
ConversationListView
not binding properly to its view model if you calledbindViewModel
before attaching the view.
- Scheduling: Replace your current usage of
nablaClient.schedulingModule
tonablaClient.schedulingClient
. - VideoCall: Replace your current usage of
nablaClient.videoCallModule
tonablaClient.videoCallClient
. - Core:
NablaClient.authenticate
is replaced byNablaClient.setCurrentUserOrThrow
andNablaClient.clearCurrentUser
.SessionTokenProvider
is set duringNablaClient.initialize
.
- Scheduling: support for registering a payment step. See doc for details/instructions.
- Fix appointments list not updated in real-time for some edge-case status changes.
- Scheduling: Added a new
nablaScheduling_appointmentListHeaderStyle
for theAppointmentsFragment
toolbar's style.
- Scheduling: The
AppointmentsFragment
now comes with aToolbar
by default, you can choose to hide it by callingsetShowNavigation(false)
on the Fragment's builder.
- Core: Added a new
watchEventsConnectionState
method onNablaClient
which allows you to monitor the current state of the network connection used to receive live events. - Messaging Core: Added a new
Response
object returned by watchers. It contains metadata about the freshness of the data returned, allowing the caller to know if the data comes from cache or is fresh and if a background refresh is in progress. - Messaging Core: Watchers should now automatically try to re-fetch fresh data when the device gets back online after being offline.
- Messaging Core:
WatchPaginatedResponse
as been renamedPaginatedContent
. - Messaging Core:
watchConversation
now returns aFlow<Response<Conversation>>
. - Messaging Core:
watchConversationItems
now returns aFlow<Response<WatchPaginatedResponse<List<ConversationItem>>>>
. - Messaging Core:
watchConversations
now returns aFlow<Response<WatchPaginatedResponse<List<Conversation>>>>
.
- Messaging UI: The
ConversationListView
will now correctly display the error state when it cannot fetch the data. It was showing a blank screen before.
- Scheduling: Fix a bug where a user could try to cancel a past appointment.
- Video Call: Better support for screen sharing.
- Added an extra step in the "schedule appointment" flow to choose between remote and physical appointments.
- Added an appointment detail view accessible from the list of appointments. For physical appointments, this view displays the address of the appointment.
- Avatars are now using
colorSurfaceVariant
as default for background color. You can change that by customizing thedefaultBackgroundColor
ofNabla.Widget.AvatarView
. - Avatars will now display a default icon when no picture or abbreviated name are available. You can change that drawable by customizing the
defaultAvatarDrawable
ofNabla.Widget.AvatarView
. - Messaging UI: Messages from Providers and other users are now using
colorSurfaceVariant
as default background color. You can change that by customizingnablaMessaging_providerMessageBackgroundColor
,nablaMessaging_otherMessageBackgroundColor
andnablaMessaging_deletedMessageBackgroundColor
- Messaging UI: Messages from Providers and other users are now using
textColorPrimary
as default text color. You can change that by customizingnablaMessaging_conversationProviderMessageAppearance
andnablaMessaging_conversationOtherMessageAppearance
- Messaging UI: Removed the elevation for Providers and other users messages cell.
- Messaging Core: Renamed
createDraftConversation
tostartConversation
. It keeps the behavior of creating the conversation lazily when the patient sends the first message. - Messaging Core:
createConversation
has been renamedcreateConversationWithMessage
and now has a requiredmessage
argument. It should be used to start a conversation on behalf of the patient with a first message from them.
- Messaging UI: Fixed the play/pause button default color in dark mode for audio messages sent by a Provider.
- Messaging UI: Fixed the appearance used for other's (System or other Patient) image messages.
- Messaging UI: Add a new
setShowNavigation
method toConversationFragment
's builder to hide the top navigation Toolbar in case you want to include the Fragment in your own navigation stack. - Messaging UI: Add a new empty state when no conversations have been created yet for the patient. You can customize this text appearance using
nablaMessaging_conversationListEmptyStateTextAppearance
.
- The SDK targets API 33, meaning you should bump your
compileSdkVersion
to be 33 or higher (this doesn't impact your app's minimum Android supported version). - Android's map addresses detection and highlighting is now deprecated and its usage for text messages in Nabla Messaging UI has been removed.
- Support for dynamic consents in Scheduling module that you can customize from the console.
- Dropped
nablaMessaging_conversationHeaderColor
in favor of the more genericnablaMessaging_conversationHeaderStyle
. com.google.android.material:material
updated from 1.5.0 to 1.6.0- Removed the
showComposer
parameter fromConversationFragment
&ConversationActivity
and relies onConversation
isLocked
property to hide the composer.
⚠️ If you were using theshowComposer
parameter, it is not available anymore and you should migrate to using lock conversation from the Console.
- Fix SDK version sync with server failing in some rare cases.
⚠️ You need to addvectorDrawables.useSupportLibrary true
in yourbuild.gradle
file underdefaultConfig
for your app if you target API 23 or lower starting with this release.
- New Messaging UI feature: You can now scan (with the camera) and send multi-page documents in conversations.
- Added support for group chats with multiple patients and providers.
- Added
onConversationHeaderClicked
callback onConversationFragment
.
- Messaging: Fix error when deleting a message on a freshly created draft conversation (i.e. with Local id).
- Messaging UI: Fix video thumbnail not showing in replied-to quoted message.
- Messaging UI: Fix file message title text appearance not fully applied from customization attribute.
- Messaging UI: Fix provider deleted message placeholder wrongly wrapped in a card-like container.
- Messaging UI: Fix conversation scroll state not restored after configuration change.
- Fix a crash on Android 6 and 7 when taking a picture with the camera in messaging UI module.
- Fix
NablaClient.authenticate
not re-throwing potential errors.
- Messaging UI: Changed the default value of
nablaMessaging_conversationPreviewBackgroundDrawable
(background of a conversation item in the inbox) from a card to a transparent-with-ripple drawable. - Messaging UI: Changed default spacing behavior for conversations-list recycler item decoration (
DefaultOffsetsItemDecoration
). - Messaging UI: Replaced customization attribute
nablaMessaging_conversationListHeaderColor
bynablaMessaging_conversationListHeaderStyle
which defaults to?toolbarSurfaceStyle
. - Messaging UI: Replaced —default values for— icons with Material equivalents (mic, send, trash bin, camera, video...).
- Messaging UI and Scheduling UI: minor theme styles and colors usage adjustments to fully support dark mode contracts.
- Messaging Core: breaking changes for the the structure of the sealed interface
MessageAuthor
andPatient
entity to accommodate for current vs other patients.
- Fix a crash introduced in alpha16 where sending or receiving a super large image could make the Conversation screen crash in messaging UI module.
- Reporting: Add a module to report anonymous events to nabla servers to help debug some features like video calls.
- Upgraded dependency on Coil from 1.4.0 to 2.2.2.
- Fix kotlinx.serialization when obfuscated by excluding serializers from proguard.
- Authentication: Fix refresh token request broken since
1.0-alpha12
due to missing kotlinx.serialization.
- Demo app has been renamed to
Messaging Sample App
to better reflect what it showcases.
- You can now define
nabla_defaultBackgroundColor
intonablaAvatarViewStyle
in your theme to customize the default background color of avatars.
- Scheduling: last day's availabilities count (shown instead of slots grid when day is not expanded) was not updated after a new page is loaded.
BookAppointmentActivity
has been renamed toScheduleAppointmentActivity
.ScheduleAppointmentActivity.newIntent
is now internal. You can launch it usingnablaClient.schedulingModule.openScheduleAppointmentActivity(Context)
.- Messaging Core
LivekitRoom
message type has been renamed toVideoCallRoom
.
- New scheduling feature module.
- New
title
field on Provider.
- Data class
WatchPaginatedResponse
moved from messaging to core package. - Deleting
ConversationItems
and replacing usage with aList<ConversationItem>
.
- Pagination for conversations and messages now has a more reasonable value (i.e. 50) and errors in page loading are properly handled.
video-call
module is now available to add Video calls to your messaging experience
- A new
modules
parameter is now required when callingNablaClient.initialize()
:
NablaClient.initialize(
modules = listOf(
NablaMessagingModule(),
),
)
- Clicking new conversation in
InboxFragment
does not immediately create a conversation anymore. It now opens a draft conversation that won't be created until a first message is sent. ConversationId
is now a sealed class that can be eitherLocal
orRemote
-
Added draft conversations: You can now create a draft conversation and reference it by the returned id as you used to reference a normal conversation. The draft conversation will exist only locally until a first message is sent — it will then be created for real.
-
Server-made i18n will now follow user's device language.
- Default color for hyperlinks had a bad contrast with the default background color of patient messages.
- Added
AuthenticationException.AuthorizationDenied
exception that can be return if the patient is not authorized to access the data. This should not happen in the current implementation.
- Conversations in
watchConversations()
are now correctly sorted by theirlastModified
date. NablaClient
is exposed through static callNablaClient.getInstance(name)
.
- Added a new
setShowComposer
method toConversationFragment.Builder
that you can call to hide the message composer for the patient. InboxFragment
a standalone fragment for displaying the list of conversations with a button to create a new conversation.ConversationActivity
a lightweight wrapper aroundConversationFragment
, convenient for default navigation behavior.
- Remove the
description
field fromConversation
and replace it by asubtitle
that is displayed by theConversationFragment
- Replaced
providerIdToAssign
by a list aproviderIds
inNablaMessagingClient.createConversation
.
- Fix test fixtures being imported outside of tests, causing Gradle sync to fail on 1.0.0-alpha05 release.
- Use
colorPrimary
inNablaAvatarView
when no user instead of hardcoded color.
- Now
messaging-core
supports messages replying to other messages. - Now
messaging-core
supports video messages. - Now on
ConversationFragment
you can reply to messages. - Now on
ConversationFragment
you can receive, play and send video messages, either from library or by recording a new one. - You can now pass your own instance of
Logger
via theConfiguration
when initializing the SDK. - Added optional
title
andproviderIdToAssign
arguments toNablaMessagingClient.createConversation
. NablaClient.initialize
now logs awarning
in case of multiple calls.
- Media in conversations: Extend support to
image/*
andaudio/*
mime types. Configuration
has been split intoNetworkConfiguration
andConfiguration
. This should not have an impact on an existing app as all the properties that have been moved are supposed to be for tests only.- Increase timeout duration to 2 minutes for network operations (especially for uploads).
- Fix an issue where
NablaMessagingClient.watchConversation
wouldn't be called correctly in some cases when the conversation is updated. - Fix duplicate activity item when a provider joins a conversation.
- Fix voice message recording on Android API < 26.
- Fix IndexOutOfBound when adding multiple media from gallery (as message attachment) with different mime types.
- Fix error handling where the SDK would return a
NablaError.Unknown
instead ofNablaError.Server
in some cases.
ConversationActivity
in conversations. A message is displayed when a provider joins a conversation.ConversationFragment
now displays system messages, with the right name and avatar.- Added support for sending, receiving and playing voice messages.
MessageSender
is renamed toMessageAuthor
.- Documents name are now displayed only on 1 line when using
ConversationFragment
. NablaMessagingClient.watchConversationMessages
replaced byNablaMessagingClient.watchConversationItems
.NablaMessagingClient.sendMessage
now takes aMessageInput
and theConversationId
rather than the message directly.FileLocal.Image
now takes an optional file name and theMimeType
of the image as parameter, along with theUri
.MessageSender.System
now exposes aUser.System
parameter which contains the name of the organization and the avatar url.- Removed
SendStatus.ToBeSent
as it was never provided as a value by the SDK.
- Uploading an image captured from camera using
ConversationFragment
would fail, this is now fixed. - In
ConversationListView
: Keep scroll at the top of conversations list when a new item is added. - In
ConversationFragment
: Now we check the mime type in media picker intent if any before inferring one from the file itself. NablaException.Authentication.NotAuthenticated
will now be correctly returned as aResult.failure
for methods that require authentication and return aResult
, rather than thrown.NablaException.Authentication.NotAuthenticated
will now be correctly sent as an error in theFlow
for methods that require authentication and return aFlow
, rather than thrown.- Fix usage of color selector as background not working on older android api levels.
- Fix media picker bottom sheet not fully shown when on landscape.
- Fix file message thumbnail placeholder having a 1px unwanted border.
- This CHANGELOG file
- Proguard configuration through
consumerProguardFiles
config.
NablaCore
is now calledNablaClient
,NablaMessaging
is now calledNablaMessagingClient
NablaCore.initialize
now doesn't require aSessionTokenProvider
, it must now be passed toNablaCore.authenticate
along with theuserId
- Some
messaging-ui
strings have been updated NablaMessagingClient.watchConversationMessages
now returns aConversationMessages
object which only contains the messages themself. Details of the conversation and its participants should now be watched usingNablaMessagingClient.watchConversation
- Some resources of
messaging-ui
andmessaging-core
have been prefixed correctly withnabla_
NablaException.Authentication
is now clearer with newNotAuthenticated
andUnableToGetFreshSessionToken
exceptions
ConversationFragment
was initializing default nabla client even if overridden with custom instance.- Remove the ability to copy or delete a deleted message when using
ConversationFragment
messaging-ui
artifact would not exposemessaging-core
apis, preventing an app relying only onmessaging-ui
from building- Internal exception mapping sometimes returning
NablaException.Unknown
for known cases
- First public version of the SDK