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 f7061d8e6..c900b3353 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 @@ -489,7 +489,7 @@ class ConversationFragment : GenericFragment() { } } - sharedViewModel.forceRefreshConversationEvent.observe(viewLifecycleOwner) { + sharedViewModel.forceRefreshConversationEvents.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Force refreshing chat messages list") viewModel.applyFilter("") diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt index 3dd8c43b3..0078263d4 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt @@ -144,7 +144,7 @@ class ConversationInfoFragment : GenericFragment() { viewModel.historyDeletedEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG History has been deleted, leaving conversation info...") - sharedViewModel.forceRefreshConversationEvent.value = Event(true) + sharedViewModel.forceRefreshConversationEvents.value = Event(true) goBack() val message = getString(R.string.toast_conversation_history_deleted) (requireActivity() as MainActivity).showGreenToast( 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 a95a7b235..509d08d2e 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 @@ -83,6 +83,15 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { private var lastMessage: ChatMessage? = null private val chatRoomListener = object : ChatRoomListenerStub() { + @WorkerThread + override fun onStateChanged(chatRoom: ChatRoom, newState: ChatRoom.State?) { + Log.i("$TAG Chat room state changed [${chatRoom.state}]") + if (chatRoom.state == ChatRoom.State.Created) { + subject.postValue(chatRoom.subject) + computeParticipants() + } + } + @WorkerThread override fun onIsComposingReceived( chatRoom: ChatRoom, @@ -112,6 +121,7 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { @WorkerThread override fun onSubjectChanged(chatRoom: ChatRoom, eventLog: EventLog) { + Log.i("$TAG Chat room subject changed [${chatRoom.subject}]") subject.postValue(chatRoom.subject) updateLastUpdatedTime() } @@ -139,45 +149,9 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { init { chatRoom.addListener(chatRoomListener) - subject.postValue(chatRoom.subject) - lastUpdateTime.postValue(chatRoom.lastUpdateTime) computeComposingLabel() - - val friends = arrayListOf() - val address = if (chatRoom.hasCapability(Capabilities.Basic.toInt())) { - Log.i("$TAG Chat room [$id] is 'Basic'") - chatRoom.peerAddress - } else { - val firstParticipant = chatRoom.participants.firstOrNull() - if (isGroup) { - Log.i("$TAG Group chat room [$id] has [${chatRoom.nbParticipants}] participant(s)") - for (participant in chatRoom.participants) { - val friend = coreContext.contactsManager.findContactByAddress( - participant.address - ) - if (friend != null && !friends.contains(friend)) { - friends.add(friend) - } - } - } else { - Log.i( - "$TAG Chat room [$id] is with participant [${firstParticipant?.address?.asStringUriOnly()}]" - ) - } - firstParticipant?.address ?: chatRoom.peerAddress - } - - if (isGroup) { - val fakeFriend = coreContext.core.createFriend() - val model = ContactAvatarModel(fakeFriend) - model.defaultToConversationIcon.postValue(true) - model.setPicturesFromFriends(friends) - avatarModel.postValue(model) - } else { - avatarModel.postValue( - coreContext.contactsManager.getContactAvatarModelForAddress(address) - ) - } + subject.postValue(chatRoom.subject) + computeParticipants() isMuted.postValue(chatRoom.muted) isEphemeral.postValue(chatRoom.isEphemeralEnabled) @@ -308,6 +282,46 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { } } dateTime.postValue(humanReadableTimestamp) + lastUpdateTime.postValue(timestamp) + } + + @WorkerThread + private fun computeParticipants() { + val friends = arrayListOf() + val address = if (chatRoom.hasCapability(Capabilities.Basic.toInt())) { + Log.i("$TAG Chat room [$id] is 'Basic'") + chatRoom.peerAddress + } else { + val firstParticipant = chatRoom.participants.firstOrNull() + if (isGroup) { + Log.i("$TAG Group chat room [$id] has [${chatRoom.nbParticipants}] participant(s)") + for (participant in chatRoom.participants) { + val friend = coreContext.contactsManager.findContactByAddress( + participant.address + ) + if (friend != null && !friends.contains(friend)) { + friends.add(friend) + } + } + } else { + Log.i( + "$TAG Chat room [$id] is with participant [${firstParticipant?.address?.asStringUriOnly()}]" + ) + } + firstParticipant?.address ?: chatRoom.peerAddress + } + + if (isGroup) { + val fakeFriend = coreContext.core.createFriend() + val model = ContactAvatarModel(fakeFriend) + model.defaultToConversationIcon.postValue(true) + model.setPicturesFromFriends(friends) + avatarModel.postValue(model) + } else { + avatarModel.postValue( + coreContext.contactsManager.getContactAvatarModelForAddress(address) + ) + } } @WorkerThread 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 2d929d147..f59388e26 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 @@ -67,10 +67,6 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { var scrollingPosition: Int = SCROLLING_POSITION_NOT_SET - val requestKeyboardHidingEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - val focusSearchBarEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -92,6 +88,14 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { lateinit var chatRoom: ChatRoom private val chatRoomListener = object : ChatRoomListenerStub() { + @WorkerThread + override fun onStateChanged(chatRoom: ChatRoom, newState: ChatRoom.State?) { + Log.i("$TAG Chat room state changed [${chatRoom.state}]") + if (chatRoom.state == ChatRoom.State.Created) { + computeConversationInfo() + } + } + @WorkerThread override fun onChatMessageSending(chatRoom: ChatRoom, eventLog: EventLog) { val message = eventLog.chatMessage @@ -144,7 +148,6 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { @WorkerThread override fun onChatMessagesReceived(chatRoom: ChatRoom, eventLogs: Array) { Log.i("$TAG Received [${eventLogs.size}] new message(s)") - chatRoom.markAsRead() computeComposingLabel() val list = arrayListOf() @@ -176,6 +179,7 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { } events.postValue(list) + chatRoom.markAsRead() } @WorkerThread 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 9c9d1c3a8..6a3451232 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 @@ -63,7 +63,7 @@ class ConversationsListViewModel @UiThread constructor() : AbstractTopBarViewMod ) when (state) { - ChatRoom.State.Created, ChatRoom.State.Instantiated -> { + ChatRoom.State.Created -> { computeChatRoomsList(currentFilter) } ChatRoom.State.Deleted -> { diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt index 7d83120b2..b8f982011 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt @@ -114,7 +114,7 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val forceRefreshConversationEvent: MutableLiveData> by lazy { + val forceRefreshConversationEvents: MutableLiveData> by lazy { MutableLiveData>() }