From c650887c04b203b14d7c1e5ab54c7f6a059de9a5 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Sun, 19 Nov 2023 11:10:13 +0100 Subject: [PATCH] More work related to ephemeral messages --- .../ui/main/chat/model/ConversationModel.kt | 16 +++++++ .../ui/main/chat/model/EventLogModel.kt | 6 +-- .../viewmodel/ConversationInfoViewModel.kt | 37 ++++++++++++-- .../chat/viewmodel/ConversationViewModel.kt | 48 +++++++++++++++++++ 4 files changed, 99 insertions(+), 8 deletions(-) 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 05606279c..bc2169f15 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 @@ -107,10 +107,23 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { unreadMessageCount.postValue(chatRoom.unreadMessagesCount) } + @WorkerThread override fun onSubjectChanged(chatRoom: ChatRoom, eventLog: EventLog) { subject.postValue(chatRoom.subject) updateLastUpdatedTime() } + + @WorkerThread + override fun onEphemeralEvent(chatRoom: ChatRoom, eventLog: EventLog) { + Log.i("$TAG Ephemeral event received [${eventLog.type}]") + isEphemeral.postValue(chatRoom.isEphemeralEnabled) + } + + @WorkerThread + override fun onEphemeralMessageDeleted(chatRoom: ChatRoom, eventLog: EventLog) { + Log.i("$TAG An ephemeral message lifetime has expired, updating last displayed message") + updateLastMessage() + } } private val chatMessageListener = object : ChatMessageListenerStub() { @@ -165,6 +178,9 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { isMuted.postValue(chatRoom.muted) isEphemeral.postValue(chatRoom.isEphemeralEnabled) + Log.i( + "$TAG Ephemeral chat messages are [${if (chatRoom.isEphemeralEnabled) "enabled" else "disabled"}], lifetime is [${chatRoom.ephemeralLifetime}]" + ) updateLastMessage() updateLastUpdatedTime() diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt index 4f6fe6977..cf2c4cae4 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/EventLogModel.kt @@ -29,9 +29,9 @@ import org.linphone.utils.LinphoneUtils class EventLogModel @WorkerThread constructor( val eventLog: EventLog, avatarModel: ContactAvatarModel, - isFromGroup: Boolean, - isGroupedWithPreviousOne: Boolean, - isGroupedWithNextOne: Boolean, + isFromGroup: Boolean = false, + isGroupedWithPreviousOne: Boolean = false, + isGroupedWithNextOne: Boolean = false, onContentClicked: ((file: String) -> Unit)? = null, onJoinConferenceClicked: ((uri: String) -> Unit)? = null, onWebUrlClicked: ((url: String) -> Unit)? = null 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 f558baddd..254e93110 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 @@ -111,6 +111,12 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { // TODO: show toast subject.postValue(chatRoom.subject) } + + @WorkerThread + override fun onEphemeralEvent(chatRoom: ChatRoom, eventLog: EventLog) { + Log.i("$TAG Ephemeral event [${eventLog.type}]") + // TODO: show toast + } } init { @@ -331,10 +337,29 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { @UiThread fun updateEphemeralLifetime(lifetime: Int) { coreContext.postOnCoreThread { - Log.i("$TAG Updating chat messages ephemeral lifetime to [$lifetime]") - chatRoom.ephemeralLifetime = lifetime.toLong() - chatRoom.isEphemeralEnabled = lifetime != 0 - ephemeralLifetime.postValue(chatRoom.ephemeralLifetime.toInt()) + if (lifetime == 0) { + if (chatRoom.isEphemeralEnabled) { + Log.i("$TAG Disabling ephemeral messages") + chatRoom.isEphemeralEnabled = false + } + } else { + if (!chatRoom.isEphemeralEnabled) { + Log.i("$TAG Enabling ephemeral messages") + chatRoom.isEphemeralEnabled = true + } + + val longLifetime = lifetime.toLong() + if (chatRoom.ephemeralLifetime != longLifetime) { + Log.i("$TAG Updating lifetime to [$longLifetime]") + chatRoom.ephemeralLifetime = longLifetime + } + } + ephemeralLifetime.postValue( + if (!chatRoom.isEphemeralEnabled) 0 else chatRoom.ephemeralLifetime.toInt() + ) + Log.i( + "$TAG Ephemeral chat messages are [${if (chatRoom.isEphemeralEnabled) "enabled" else "disabled"}], lifetime is [${chatRoom.ephemeralLifetime}]" + ) } } @@ -357,7 +382,9 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { subject.postValue(chatRoom.subject) sipUri.postValue(chatRoom.participants.firstOrNull()?.address?.asStringUriOnly()) - ephemeralLifetime.postValue(chatRoom.ephemeralLifetime.toInt()) + ephemeralLifetime.postValue( + if (!chatRoom.isEphemeralEnabled) 0 else chatRoom.ephemeralLifetime.toInt() + ) computeParticipantsList() } 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 a79a1e100..f36e24de1 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 @@ -168,6 +168,54 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { events.postValue(list) } + + @WorkerThread + override fun onNewEvents(chatRoom: ChatRoom, eventLogs: Array) { + Log.i("$TAG Adding [${eventLogs.size}] new events") + val list = arrayListOf() + list.addAll(events.value.orEmpty()) + val fakeFriend = chatRoom.core.createFriend() + val avatarModel = ContactAvatarModel(fakeFriend) + for (eventLog in eventLogs) { + Log.i("$TAG New event [${eventLog.type}] added") + list.add(EventLogModel(eventLog, avatarModel)) + } + events.postValue(list) + } + + @WorkerThread + override fun onEphemeralEvent(chatRoom: ChatRoom, eventLog: EventLog) { + Log.i("$TAG Adding new ephemeral event [${eventLog.type}]") + // Warning: when 2 ephemeral events are dispatched quickly one after the other, + // one will be missing because events.postValue() hasn't completed yet ! + // TODO FIXME: Missing event !!! + val list = arrayListOf() + list.addAll(events.value.orEmpty()) + val fakeFriend = chatRoom.core.createFriend() + val avatarModel = ContactAvatarModel(fakeFriend) + list.add(EventLogModel(eventLog, avatarModel)) + events.postValue(list) + } + + @WorkerThread + override fun onEphemeralMessageDeleted(chatRoom: ChatRoom, eventLog: EventLog) { + val eventsLogs = events.value.orEmpty() + val message = eventLog.chatMessage + Log.i("$TAG Message [${message?.messageId}] ephemeral lifetime has expired") + + val found = eventsLogs.find { + (it.model as? ChatMessageModel)?.chatMessage == message + } + if (found != null) { + val list = arrayListOf() + list.addAll(eventsLogs) + list.remove(found) + events.postValue(list) + Log.i("$TAG Message was removed from events list") + } else { + Log.w("$TAG Failed to find matching message in events list") + } + } } init {