From 3e61773f53b951bbca4b9a13f6dbfc0c18c4b0fb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 3 Sep 2020 11:09:00 +0200 Subject: [PATCH] Fixed chat display issue with auto download --- .../chat/adapters/ChatMessagesListAdapter.kt | 6 ++-- .../viewmodels/ChatMessageContentViewModel.kt | 10 +++++-- .../viewmodels/ChatMessagesListViewModel.kt | 29 +++++++------------ .../notifications/NotificationsManager.kt | 2 +- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt index 4f07a53ca..5c14bd0ba 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt @@ -237,8 +237,7 @@ class ChatMessagesListAdapter( private fun resendMessage() { val chatMessage = binding.viewModel?.chatMessage if (chatMessage != null) { - val viewHolder = binding.lifecycleOwner as ChatMessageViewHolder - chatMessage.userData = viewHolder.adapterPosition + chatMessage.userData = adapterPosition resendMessageEvent.value = Event(chatMessage) } } @@ -269,8 +268,7 @@ class ChatMessagesListAdapter( private fun deleteMessage() { val chatMessage = binding.viewModel?.chatMessage if (chatMessage != null) { - val viewHolder = binding.lifecycleOwner as ChatMessageViewHolder - chatMessage.userData = viewHolder.adapterPosition + chatMessage.userData = adapterPosition deleteMessageEvent.value = Event(chatMessage) } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt index 7c8c867ce..447b3da8b 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt @@ -79,13 +79,17 @@ class ChatMessageContentViewModel( isVideo.value = false } } else { - Log.i("[Content] Found downloadable content: ${content.name}") + if (chatMessage.isFileTransferInProgress) { + Log.i("[Content] Found content currently being downloaded: ${content.name}") + downloadEnabled.value = false + } else { + Log.i("[Content] Found downloadable content: ${content.name}") + downloadEnabled.value = true + } downloadable.value = true isImage.value = false isVideo.value = false } - - downloadEnabled.value = downloadable.value } fun download() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt index c554dc474..6e276a724 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt @@ -58,30 +58,22 @@ class ChatMessagesListViewModel(private val chatRoom: ChatRoom) : ViewModel() { MutableLiveData>() } - private val chatMessageListener: ChatMessageListenerStub = object : ChatMessageListenerStub() { - override fun onMsgStateChanged(message: ChatMessage, state: ChatMessage.State) { - if (state == ChatMessage.State.Displayed) { - message.removeListener(this) - } - - val position: Int? = message.userData as? Int? - if (position != null) { - messageUpdatedEvent.value = Event(position) - } - } - } - private val chatRoomListener: ChatRoomListenerStub = object : ChatRoomListenerStub() { override fun onChatMessageReceived(chatRoom: ChatRoom, eventLog: EventLog) { chatRoom.markAsRead() - val position = events.value?.size ?: 0 - if (eventLog.type == EventLog.Type.ConferenceChatMessage) { val chatMessage = eventLog.chatMessage chatMessage ?: return - chatMessage.userData = position - chatMessage.addListener(chatMessageListener) + chatMessage.userData = events.value.orEmpty().size + + val existingEvent = events.value.orEmpty().find { + it.type == EventLog.Type.ConferenceChatMessage && it.chatMessage == chatMessage + } + if (existingEvent != null) { + Log.w("[Chat Messages] Found already present chat message, don't add it it's probably the result of an auto download") + return + } if (Version.sdkStrictlyBelow(Version.API29_ANDROID_10) && !PermissionHelper.get().hasWriteExternalStorage()) { for (content in chatMessage.contents) { @@ -98,13 +90,12 @@ class ChatMessagesListViewModel(private val chatRoom: ChatRoom) : ViewModel() { } override fun onChatMessageSent(chatRoom: ChatRoom, eventLog: EventLog) { - val position = events.value?.size ?: 0 + val position = events.value.orEmpty().size if (eventLog.type == EventLog.Type.ConferenceChatMessage) { val chatMessage = eventLog.chatMessage chatMessage ?: return chatMessage.userData = position - chatMessage.addListener(chatMessageListener) } addEvent(eventLog) diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 2ccad03d7..80c845457 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -123,7 +123,7 @@ class NotificationsManager(private val context: Context) { Call.State.End, Call.State.Error -> dismissCallNotification(call) Call.State.Released -> { if (call.callLog.status == Call.Status.Missed || - call.callLog.status == Call.Status.Aborted || + call.callLog.status == Call.Status.Aborted || call.callLog.status == Call.Status.EarlyAborted) { displayMissedCallNotification(call) }