From f5536ba9a62a71a16daf9d1670eaa96c5398d463 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 13 Feb 2026 15:18:42 +0100 Subject: [PATCH] Switched to chatRoom.subjectUft8 + fixed notification & shortcut label when group chat room subject is updated --- .../notifications/NotificationsManager.kt | 18 ++++++++++++++---- .../ui/call/viewmodel/CurrentCallViewModel.kt | 2 +- .../ui/main/chat/model/ConversationModel.kt | 14 +++++++------- .../viewmodel/AbstractConversationViewModel.kt | 2 +- .../ConversationForwardMessageViewModel.kt | 2 +- .../viewmodel/ConversationInfoViewModel.kt | 18 +++++++++--------- .../chat/viewmodel/ConversationViewModel.kt | 10 +++++----- .../viewmodel/ConversationsListViewModel.kt | 2 +- .../viewmodel/StartConversationViewModel.kt | 2 +- .../contacts/viewmodel/ContactViewModel.kt | 2 +- .../main/history/viewmodel/HistoryViewModel.kt | 2 +- .../viewmodel/AddressSelectionViewModel.kt | 6 +++--- .../java/org/linphone/utils/ShortcutUtils.kt | 2 +- 13 files changed, 46 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 1240e989d..779bf9e4f 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -492,6 +492,13 @@ class NotificationsManager Log.i("$TAG A message has been edited, checking if notification should be updated") updateConversationNotification(chatRoom, message) } + + override fun onChatRoomSubjectChanged(core: Core, chatRoom: ChatRoom) { + if (ShortcutUtils.isShortcutToChatRoomAlreadyCreated(coreContext.context, chatRoom)) { + Log.i("$TAG Updating chat room shortcut with new subject [${chatRoom.subjectUtf8}]") + ShortcutUtils.createOrUpdateChatRoomShortcut(coreContext.context, chatRoom) + } + } } val chatMessageListener: ChatMessageListener = object : ChatMessageListenerStub() { @@ -1019,7 +1026,7 @@ class NotificationsManager notifiable.isGroup = false } else { notifiable.isGroup = true - notifiable.groupTitle = chatRoom.subject + notifiable.groupTitle = chatRoom.subjectUtf8 } for (message in chatRoom.unreadHistory) { @@ -1028,6 +1035,9 @@ class NotificationsManager notifiable.messages.add(notifiableMessage) } } else { + // Update notification subject in case it has changed since last message + notifiable.groupTitle = chatRoom.subjectUtf8 + for (message in messages) { if (message.isRead || message.isOutgoing) continue val notifiableMessage = getNotifiableForChatMessage(message) @@ -1044,11 +1054,11 @@ class NotificationsManager val notifiable = getNotifiableForConversation(chatRoom, messages) if (!chatRoom.hasCapability(ChatRoom.Capabilities.OneToOne.toInt())) { - if (chatRoom.subject != notifiable.groupTitle) { + if (chatRoom.subjectUtf8 != notifiable.groupTitle) { Log.i( - "$TAG Updating notification subject from [${notifiable.groupTitle}] to [${chatRoom.subject}]" + "$TAG Updating notification subject from [${notifiable.groupTitle}] to [${chatRoom.subjectUtf8}]" ) - notifiable.groupTitle = chatRoom.subject + notifiable.groupTitle = chatRoom.subjectUtf8 } } diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index b92378136..fc410ab76 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -421,7 +421,7 @@ class CurrentCallViewModel if (state == ChatRoom.State.Instantiated) return val id = LinphoneUtils.getConversationId(chatRoom) - Log.i("$TAG Conversation [$id] (${chatRoom.subject}) state changed: [$state]") + Log.i("$TAG Conversation [$id] (${chatRoom.subjectUtf8}) state changed: [$state]") if (state == ChatRoom.State.Created) { Log.i("$TAG Conversation [$id] successfully created") diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt index 3cf329822..29e7a097f 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt @@ -101,7 +101,7 @@ class ConversationModel override fun onStateChanged(chatRoom: ChatRoom, newState: ChatRoom.State?) { Log.i("$TAG Conversation state changed [${chatRoom.state}]") if (chatRoom.state == ChatRoom.State.Created) { - subject.postValue(chatRoom.subject) + subject.postValue(chatRoom.subjectUtf8) computeParticipants() } else if (chatRoom.state == ChatRoom.State.Deleted) { Log.i("$TAG Conversation [$id] has been deleted") @@ -113,7 +113,7 @@ class ConversationModel override fun onConferenceJoined(chatRoom: ChatRoom, eventLog: EventLog) { // This is required as a Created chat room may not have the participants list yet Log.i("$TAG Conversation has been joined") - subject.postValue(chatRoom.subject) + subject.postValue(chatRoom.subjectUtf8) computeParticipants() } @@ -156,8 +156,8 @@ class ConversationModel @WorkerThread override fun onSubjectChanged(chatRoom: ChatRoom, eventLog: EventLog) { - Log.i("$TAG Conversation subject changed [${chatRoom.subject}]") - subject.postValue(chatRoom.subject) + Log.i("$TAG Conversation subject changed [${chatRoom.subjectUtf8}]") + subject.postValue(chatRoom.subjectUtf8) computeParticipants() } @@ -201,7 +201,7 @@ class ConversationModel chatRoom.addListener(chatRoomListener) computeComposingLabel() - subject.postValue(chatRoom.subject) + subject.postValue(chatRoom.subjectUtf8) computeParticipants() isMuted.postValue(chatRoom.muted) @@ -433,9 +433,9 @@ class ConversationModel } if (isGroup) { - if (avatarModel.value == null || avatarModel.value?.contactName != chatRoom.subject) { + if (avatarModel.value == null || avatarModel.value?.contactName != chatRoom.subjectUtf8) { val fakeFriend = coreContext.core.createFriend() - fakeFriend.name = chatRoom.subject + fakeFriend.name = chatRoom.subjectUtf8 val model = ContactAvatarModel(fakeFriend) model.defaultToConversationIcon.postValue(true) model.updateSecurityLevelUsingConversation(chatRoom) diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt index b3fce51af..0425a86fc 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt @@ -169,7 +169,7 @@ abstract class AbstractConversationViewModel : GenericViewModel() { return@postOnCoreThread } - val conference = LinphoneUtils.createGroupCall(account, chatRoom.subject.orEmpty()) + val conference = LinphoneUtils.createGroupCall(account, chatRoom.subjectUtf8.orEmpty()) if (conference == null) { Log.e("$TAG Failed to create group call!") showRedToast(R.string.conference_failed_to_create_group_call_toast, R.drawable.warning_circle) diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationForwardMessageViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationForwardMessageViewModel.kt index fe181a3e4..ea6481c3f 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationForwardMessageViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationForwardMessageViewModel.kt @@ -58,7 +58,7 @@ class ConversationForwardMessageViewModel if (state == ChatRoom.State.Instantiated) return val id = LinphoneUtils.getConversationId(chatRoom) - Log.i("$TAG Conversation [$id] (${chatRoom.subject}) state changed: [$state]") + Log.i("$TAG Conversation [$id] (${chatRoom.subjectUtf8}) state changed: [$state]") if (state == ChatRoom.State.Created) { Log.i("$TAG Conversation [$id] successfully created") diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt index 7cd0d0d40..7f646e362 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt @@ -107,7 +107,7 @@ class ConversationInfoViewModel private val chatRoomListener = object : ChatRoomListenerStub() { @WorkerThread override fun onParticipantAdded(chatRoom: ChatRoom, eventLog: EventLog) { - Log.i("$TAG A participant has been added to the group [${chatRoom.subject}]") + Log.i("$TAG A participant has been added to the group [${chatRoom.subjectUtf8}]") val message = AppUtils.getFormattedString( R.string.conversation_info_participant_added_to_conversation_toast, getParticipant(eventLog) @@ -120,7 +120,7 @@ class ConversationInfoViewModel @WorkerThread override fun onParticipantRemoved(chatRoom: ChatRoom, eventLog: EventLog) { - Log.i("$TAG A participant has been removed from the group [${chatRoom.subject}]") + Log.i("$TAG A participant has been removed from the group [${chatRoom.subjectUtf8}]") val message = AppUtils.getFormattedString( R.string.conversation_info_participant_removed_from_conversation_toast, getParticipant(eventLog) @@ -134,7 +134,7 @@ class ConversationInfoViewModel @WorkerThread override fun onParticipantAdminStatusChanged(chatRoom: ChatRoom, eventLog: EventLog) { Log.i( - "$TAG A participant has been given/removed administration rights for group [${chatRoom.subject}]" + "$TAG A participant has been given/removed administration rights for group [${chatRoom.subjectUtf8}]" ) if (eventLog.type == EventLog.Type.ConferenceParticipantSetAdmin) { val message = AppUtils.getFormattedString( @@ -156,11 +156,11 @@ class ConversationInfoViewModel @WorkerThread override fun onSubjectChanged(chatRoom: ChatRoom, eventLog: EventLog) { Log.i( - "$TAG Conversation [${LinphoneUtils.getConversationId(chatRoom)}] has a new subject [${chatRoom.subject}]" + "$TAG Conversation [${LinphoneUtils.getConversationId(chatRoom)}] has a new subject [${chatRoom.subjectUtf8}]" ) showGreenToast(R.string.conversation_subject_changed_toast, R.drawable.check) - subject.postValue(chatRoom.subject) + subject.postValue(chatRoom.subjectUtf8) computeParticipantsList() infoChangedEvent.postValue(Event(true)) } @@ -263,7 +263,7 @@ class ConversationInfoViewModel participantsList.add(participant.address.asStringUriOnly()) } goToScheduleMeetingEvent.postValue( - Event(Pair(chatRoom.subject.orEmpty(), participantsList)) + Event(Pair(chatRoom.subjectUtf8.orEmpty(), participantsList)) ) } else { val firstParticipant = chatRoom.participants.firstOrNull() @@ -464,10 +464,10 @@ class ConversationInfoViewModel val readOnly = chatRoom.isReadOnly isReadOnly.postValue(readOnly) if (readOnly) { - Log.w("$TAG Conversation with subject [${chatRoom.subject}] is read only!") + Log.w("$TAG Conversation with subject [${chatRoom.subjectUtf8}] is read only!") } - subject.postValue(chatRoom.subject) + subject.postValue(chatRoom.subjectUtf8) peerSipUri.postValue(chatRoom.peerAddress.asStringUriOnly()) val firstParticipant = chatRoom.participants.firstOrNull() @@ -558,7 +558,7 @@ class ConversationInfoViewModel val avatar = if (groupChatRoom) { val fakeFriend = coreContext.core.createFriend() - fakeFriend.name = chatRoom.subject + fakeFriend.name = chatRoom.subjectUtf8 val model = ContactAvatarModel(fakeFriend) model.defaultToConversationIcon.postValue(true) model.updateSecurityLevelUsingConversation(chatRoom) diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index 2833c000d..18f0188e4 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -250,7 +250,7 @@ class ConversationViewModel @WorkerThread override fun onSubjectChanged(chatRoom: ChatRoom, eventLog: EventLog) { - Log.i("$TAG Conversation subject changed [${chatRoom.subject}]") + Log.i("$TAG Conversation subject changed [${chatRoom.subjectUtf8}]") addEvents(arrayOf(eventLog)) } @@ -580,7 +580,7 @@ class ConversationViewModel if (!chatRoom.hasCapability(ChatRoom.Capabilities.Encrypted.toInt())) { if (LinphoneUtils.getAccountForAddress(chatRoom.localAddress)?.params?.instantMessagingEncryptionMandatory == true) { Log.w( - "$TAG Conversation with subject [${chatRoom.subject}] is considered as read-only because it isn't encrypted and default account is in secure mode" + "$TAG Conversation with subject [${chatRoom.subjectUtf8}] is considered as read-only because it isn't encrypted and default account is in secure mode" ) isDisabledBecauseNotSecured.postValue(true) } else { @@ -655,12 +655,12 @@ class ConversationViewModel val readOnly = chatRoom.isReadOnly isReadOnly.postValue(readOnly) if (readOnly) { - Log.w("$TAG Conversation with subject [${chatRoom.subject}] is read only!") + Log.w("$TAG Conversation with subject [${chatRoom.subjectUtf8}] is read only!") } checkIfConversationShouldBeDisabledForSecurityReasons() - subject.postValue(chatRoom.subject) + subject.postValue(chatRoom.subjectUtf8) computeParticipantsInfo() @@ -693,7 +693,7 @@ class ConversationViewModel val avatar = if (LinphoneUtils.isChatRoomAGroup(chatRoom)) { val fakeFriend = coreContext.core.createFriend() - fakeFriend.name = chatRoom.subject + fakeFriend.name = chatRoom.subjectUtf8 val model = ContactAvatarModel(fakeFriend) model.updateSecurityLevelUsingConversation(chatRoom) model diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt index b1843af65..63879a2e0 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt @@ -85,7 +85,7 @@ class ConversationsListViewModel if (state == ChatRoom.State.Instantiated) return val id = LinphoneUtils.getConversationId(chatRoom) - Log.i("$TAG Conversation [$id] (${chatRoom.subject}) state changed: [$state]") + Log.i("$TAG Conversation [$id] (${chatRoom.subjectUtf8}) state changed: [$state]") if (state == ChatRoom.State.Created) { Log.i("$TAG Conversation [$id] successfully created") diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt index 42cddc41d..3df35525b 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/StartConversationViewModel.kt @@ -63,7 +63,7 @@ class StartConversationViewModel if (state == ChatRoom.State.Instantiated) return val id = LinphoneUtils.getConversationId(chatRoom) - Log.i("$TAG Conversation [$id] (${chatRoom.subject}) state changed: [$state]") + Log.i("$TAG Conversation [$id] (${chatRoom.subjectUtf8}) state changed: [$state]") if (state == ChatRoom.State.Created) { Log.i("$TAG Conversation [$id] successfully created") diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt index 2aab2ea51..eb15c30bd 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt @@ -201,7 +201,7 @@ class ContactViewModel if (state == ChatRoom.State.Instantiated) return val id = LinphoneUtils.getConversationId(chatRoom) - Log.i("$TAG Conversation [$id] (${chatRoom.subject}) state changed: [$state]") + Log.i("$TAG Conversation [$id] (${chatRoom.subjectUtf8}) state changed: [$state]") if (state == ChatRoom.State.Created) { Log.i("$TAG Conversation [$id] successfully created") diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt index ed81b343d..9eae4870a 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryViewModel.kt @@ -110,7 +110,7 @@ class HistoryViewModel if (state == ChatRoom.State.Instantiated) return val id = LinphoneUtils.getConversationId(chatRoom) - Log.i("$TAG Conversation [$id] (${chatRoom.subject}) state changed: [$state]") + Log.i("$TAG Conversation [$id] (${chatRoom.subjectUtf8}) state changed: [$state]") if (state == ChatRoom.State.Created) { Log.i("$TAG Conversation [$id] successfully created") diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt index a4a414a03..053d198c9 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt @@ -448,7 +448,7 @@ abstract class AddressSelectionViewModel null } } else { - if (chatRoom.subject.orEmpty().contains(filter, ignoreCase = true)) { + if (chatRoom.subjectUtf8.orEmpty().contains(filter, ignoreCase = true)) { chatRoom } else { chatRoom.participants.find { @@ -491,7 +491,7 @@ abstract class AddressSelectionViewModel val subject = if (isOneToOne) { friend?.name } else { - chatRoom.subject + chatRoom.subjectUtf8 } val model = ConversationContactOrSuggestionModel( remoteAddress, @@ -502,7 +502,7 @@ abstract class AddressSelectionViewModel val avatarModel = if (!isOneToOne) { val fakeFriend = coreContext.core.createFriend() - fakeFriend.name = chatRoom.subject + fakeFriend.name = chatRoom.subjectUtf8 val avatarModel = ContactAvatarModel(fakeFriend) avatarModel.defaultToConversationIcon.postValue(true) avatarModel diff --git a/app/src/main/java/org/linphone/utils/ShortcutUtils.kt b/app/src/main/java/org/linphone/utils/ShortcutUtils.kt index 6e75f08b9..2be768383 100644 --- a/app/src/main/java/org/linphone/utils/ShortcutUtils.kt +++ b/app/src/main/java/org/linphone/utils/ShortcutUtils.kt @@ -140,7 +140,7 @@ class ShortcutUtils { ).buildIcon() } else { isGroup = true - subject = chatRoom.subject.orEmpty() + subject = chatRoom.subjectUtf8.orEmpty() AvatarGenerator(context).setInitials(AppUtils.getInitials(subject)).buildIcon() }