From fa7486ff36b5262aa9ababb422dc445fad520a22 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 18 Sep 2024 10:39:14 +0200 Subject: [PATCH] Fixed issue with forward message --- .../ConversationForwardMessageFragment.kt | 13 ++++++++---- .../chat/fragment/ConversationFragment.kt | 16 ++++++++++++++- .../chat/viewmodel/ConversationViewModel.kt | 20 ++++++++++++++++++- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt index a13ce198d..71ceb7b56 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationForwardMessageFragment.kt @@ -55,6 +55,8 @@ class ConversationForwardMessageFragment : SlidingPaneChildFragment() { private var numberOrAddressPickerDialog: Dialog? = null + private var disableConsumingEventOnPause = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -135,6 +137,7 @@ class ConversationForwardMessageFragment : SlidingPaneChildFragment() { localSipUri, remoteSipUri ) + disableConsumingEventOnPause = true findNavController().navigate(action) } } @@ -171,10 +174,12 @@ class ConversationForwardMessageFragment : SlidingPaneChildFragment() { numberOrAddressPickerDialog?.dismiss() numberOrAddressPickerDialog = null - sharedViewModel.messageToForwardEvent.value?.consume { - Log.w( - "$TAG Fragment is pausing, consuming forward event to prevent it from being used later" - ) + if (!disableConsumingEventOnPause) { + sharedViewModel.messageToForwardEvent.value?.consume { + Log.w( + "$TAG Fragment is pausing, consuming forward event to prevent it from being used later" + ) + } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index 072b986e2..e6dfca835 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -469,8 +469,9 @@ open class ConversationFragment : SlidingPaneChildFragment() { Log.i("$TAG Found message to forward") if (viewModel.isReadOnly.value == true || viewModel.isDisabledBecauseNotSecured.value == true) { Log.w( - "$TAG Can't forward message in this conversation as it is read only" + "$TAG Can't forward message in this conversation as it is read only, keeping it in memory until conversation is joined just in case" ) + viewModel.pendingForwardMessage = toForward } else { sendMessageViewModel.forwardMessage(toForward) } @@ -480,6 +481,19 @@ open class ConversationFragment : SlidingPaneChildFragment() { } } + viewModel.forwardMessageEvent.observe(viewLifecycleOwner) { + it.consume { toForward -> + Log.i("$TAG Found pending message to forward") + if (viewModel.isReadOnly.value == true || viewModel.isDisabledBecauseNotSecured.value == true) { + Log.w( + "$TAG Can't forward message in this conversation as it is still read only" + ) + } else { + sendMessageViewModel.forwardMessage(toForward) + } + } + } + viewModel.updateEvents.observe(viewLifecycleOwner) { it.consume { val items = viewModel.eventsList 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 41bd6ad4a..09714b0e8 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 @@ -129,8 +129,14 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo MutableLiveData>() } + val forwardMessageEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + var eventsList = arrayListOf() + var pendingForwardMessage: MessageModel? = null + private var latestMatch: EventLog? = null private val chatRoomListener = object : ChatRoomListenerStub() { @@ -138,6 +144,13 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo override fun onConferenceJoined(chatRoom: ChatRoom, eventLog: EventLog) { Log.i("$TAG Conversation was joined") computeConversationInfo() + + val messageToForward = pendingForwardMessage + if (messageToForward != null) { + Log.i("$TAG Found pending forward message, doing it now") + forwardMessageEvent.postValue(Event(messageToForward)) + pendingForwardMessage = null + } } @WorkerThread @@ -552,7 +565,7 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo if (!chatRoom.hasCapability(ChatRoom.Capabilities.Encrypted.toInt())) { if (LinphoneUtils.getAccountForAddress(chatRoom.localAddress)?.params?.instantMessagingEncryptionMandatory == true) { Log.w( - "$TAG Conversation with subject [${chatRoom.subject}] has been disabled because it isn't encrypted and default account is in secure mode" + "$TAG Conversation with subject [${chatRoom.subject}] is considered as read-only because it isn't encrypted and default account is in secure mode" ) isDisabledBecauseNotSecured.postValue(true) } else { @@ -604,6 +617,11 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo val empty = chatRoom.hasCapability(ChatRoom.Capabilities.Conference.toInt()) && chatRoom.participants.isEmpty() + if (empty) { + Log.w( + "$TAG Conversation has conference capability but has no participants, will be considered as read only!" + ) + } val readOnly = chatRoom.isReadOnly || empty isReadOnly.postValue(readOnly) if (readOnly) {