From d9b0d6c7405b2b7abec9a5b00383130f443e9049 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2024 11:53:34 +0100 Subject: [PATCH] Factorized code --- .../chat/adapter/ConversationsFilesAdapter.kt | 2 +- .../ConversationDocumentsListFragment.kt | 10 +- .../chat/fragment/ConversationFragment.kt | 22 ++-- .../fragment/ConversationMediaListFragment.kt | 10 +- .../AbstractConversationViewModel.kt | 123 ++++++++++++++++++ .../ConversationDocumentsListViewModel.kt | 115 ++++------------ .../viewmodel/ConversationInfoViewModel.kt | 74 ++--------- .../ConversationMediaListViewModel.kt | 115 ++++------------ .../chat/viewmodel/ConversationViewModel.kt | 79 ++--------- .../fragment/MediaListViewerFragment.kt | 6 - 10 files changed, 218 insertions(+), 338 deletions(-) create mode 100644 app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt diff --git a/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationsFilesAdapter.kt b/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationsFilesAdapter.kt index af00ad335..dacd151be 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationsFilesAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationsFilesAdapter.kt @@ -100,7 +100,7 @@ class ConversationsFilesAdapter : ListAdapter - val count = items.size - Log.i( - "$TAG Found [$count] documents for conversation with local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" - ) - adapter.submitList(items) + if (items != adapter.currentList || items.size != adapter.itemCount) { + adapter.submitList(items) + Log.i("$TAG Documents list updated with [${items.size}] items") + } } viewModel.openDocumentEvent.observe(viewLifecycleOwner) { 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 7fe6682d9..118b45426 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 @@ -379,13 +379,15 @@ class ConversationFragment : SlidingPaneChildFragment() { sendMessageViewModel.configureChatRoom(viewModel.chatRoom) if (viewModel.isEndToEndEncrypted.value == true) { - headerItemDecoration = RecyclerViewHeaderDecoration( - requireContext(), - adapter, - false - ) - binding.eventsList.addItemDecoration(headerItemDecoration) - binding.eventsList.addOnItemTouchListener(listItemTouchListener) + if (binding.eventsList.itemDecorationCount == 0) { + headerItemDecoration = RecyclerViewHeaderDecoration( + requireContext(), + adapter, + false + ) + binding.eventsList.addItemDecoration(headerItemDecoration) + binding.eventsList.addOnItemTouchListener(listItemTouchListener) + } } // Wait for chat room to be ready before trying to forward a message in it @@ -406,8 +408,10 @@ class ConversationFragment : SlidingPaneChildFragment() { } viewModel.events.observe(viewLifecycleOwner) { items -> - adapter.submitList(items) - Log.i("$TAG Events (messages) list updated with [${items.size}] items") + if (items != adapter.currentList || items.size != adapter.itemCount) { + adapter.submitList(items) + Log.i("$TAG Events (messages) list updated with [${items.size}] items") + } (view.parent as? ViewGroup)?.doOnPreDraw { sharedViewModel.openSlidingPaneEvent.value = Event(true) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt index e6e59e284..0ada714d1 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt @@ -114,17 +114,15 @@ class ConversationMediaListFragment : SlidingPaneChildFragment() { it.consume { (view.parent as? ViewGroup)?.doOnPreDraw { startPostponedEnterTransition() - viewModel.loadMediaList() } } } viewModel.mediaList.observe(viewLifecycleOwner) { items -> - val count = items.size - Log.i( - "$TAG Found [$count] media for conversation with local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" - ) - adapter.submitList(items) + if (items != adapter.currentList || items.size != adapter.itemCount) { + adapter.submitList(items) + Log.i("$TAG Media list updated with [${items.size}] items") + } } viewModel.openMediaEvent.observe(viewLifecycleOwner) { 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 new file mode 100644 index 000000000..14f8416ee --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/AbstractConversationViewModel.kt @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.main.chat.viewmodel + +import androidx.annotation.UiThread +import androidx.annotation.WorkerThread +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import org.linphone.LinphoneApplication +import org.linphone.core.ChatRoom +import org.linphone.core.Factory +import org.linphone.core.tools.Log +import org.linphone.utils.Event + +abstract class AbstractConversationViewModel : ViewModel() { + companion object { + private const val TAG = "[Abstract Conversation ViewModel]" + } + + val chatRoomFoundEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + lateinit var chatRoom: ChatRoom + + lateinit var localSipUri: String + + lateinit var remoteSipUri: String + + fun isChatRoomInitialized(): Boolean { + return ::chatRoom.isInitialized + } + + @WorkerThread + open fun beforeNotifyingChatRoomFound(sameOne: Boolean) { + } + + @WorkerThread + open fun afterNotifyingChatRoomFound(sameOne: Boolean) { + } + + @UiThread + fun findChatRoom(room: ChatRoom?, localSipUri: String, remoteSipUri: String) { + this.localSipUri = localSipUri + this.remoteSipUri = remoteSipUri + + LinphoneApplication.coreContext.postOnCoreThread { core -> + Log.i( + "$TAG Looking for conversation with local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" + ) + if (room != null && ::chatRoom.isInitialized && chatRoom == room) { + Log.i("$TAG Conversation object already in memory, skipping") + + beforeNotifyingChatRoomFound(sameOne = true) + chatRoomFoundEvent.postValue(Event(true)) + afterNotifyingChatRoomFound(sameOne = true) + + return@postOnCoreThread + } + + val localAddress = Factory.instance().createAddress(localSipUri) + val remoteAddress = Factory.instance().createAddress(remoteSipUri) + + if (room != null && (!::chatRoom.isInitialized || chatRoom != room)) { + if (localAddress?.weakEqual(room.localAddress) == true && remoteAddress?.weakEqual( + room.peerAddress + ) == true + ) { + Log.i("$TAG Conversation object available in sharedViewModel, using it") + chatRoom = room + + beforeNotifyingChatRoomFound(sameOne = false) + chatRoomFoundEvent.postValue(Event(true)) + afterNotifyingChatRoomFound(sameOne = false) + + return@postOnCoreThread + } + } + + if (localAddress != null && remoteAddress != null) { + Log.i("$TAG Searching for conversation in Core using local & peer SIP addresses") + val found = core.searchChatRoom( + null, + localAddress, + remoteAddress, + arrayOfNulls( + 0 + ) + ) + if (found != null) { + chatRoom = found + + beforeNotifyingChatRoomFound(sameOne = false) + chatRoomFoundEvent.postValue(Event(true)) + afterNotifyingChatRoomFound(sameOne = false) + } else { + Log.e("$TAG Failed to find conversation given local & remote addresses!") + chatRoomFoundEvent.postValue(Event(false)) + } + } else { + Log.e("$TAG Failed to parse local or remote SIP URI as Address!") + chatRoomFoundEvent.postValue(Event(false)) + } + } + } +} diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationDocumentsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationDocumentsListViewModel.kt index 56d1c929f..0141cbf93 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationDocumentsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationDocumentsListViewModel.kt @@ -20,17 +20,14 @@ package org.linphone.ui.main.chat.viewmodel import androidx.annotation.UiThread +import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.core.ChatRoom -import org.linphone.core.Factory import org.linphone.core.tools.Log import org.linphone.ui.main.chat.model.FileModel import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class ConversationDocumentsListViewModel @UiThread constructor() : ViewModel() { +class ConversationDocumentsListViewModel @UiThread constructor() : AbstractConversationViewModel() { companion object { private const val TAG = "[Conversation Documents List ViewModel]" } @@ -39,98 +36,40 @@ class ConversationDocumentsListViewModel @UiThread constructor() : ViewModel() { val operationInProgress = MutableLiveData() - val chatRoomFoundEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - val openDocumentEvent: MutableLiveData> by lazy { MutableLiveData>() } - private lateinit var chatRoom: ChatRoom - - lateinit var localSipUri: String - - lateinit var remoteSipUri: String - - @UiThread - fun findChatRoom(room: ChatRoom?, localSipUri: String, remoteSipUri: String) { - this.localSipUri = localSipUri - this.remoteSipUri = remoteSipUri - - coreContext.postOnCoreThread { core -> - Log.i( - "$TAG Looking for conversation with local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" - ) - if (room != null && ::chatRoom.isInitialized && chatRoom == room) { - Log.i("$TAG Conversation object already in memory, skipping") - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - - val localAddress = Factory.instance().createAddress(localSipUri) - val remoteAddress = Factory.instance().createAddress(remoteSipUri) - - if (room != null && (!::chatRoom.isInitialized || chatRoom != room)) { - if (localAddress?.weakEqual(room.localAddress) == true && remoteAddress?.weakEqual( - room.peerAddress - ) == true - ) { - Log.i("$TAG Conversation object available in sharedViewModel, using it") - chatRoom = room - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - } - - if (localAddress != null && remoteAddress != null) { - Log.i("$TAG Searching for conversation in Core using local & peer SIP addresses") - val found = core.searchChatRoom( - null, - localAddress, - remoteAddress, - arrayOfNulls( - 0 - ) - ) - if (found != null) { - chatRoom = found - chatRoomFoundEvent.postValue(Event(true)) - } - } - } + override fun beforeNotifyingChatRoomFound(sameOne: Boolean) { + loadDocumentsList() } - @UiThread - fun loadDocumentsList() { - operationInProgress.value = true + @WorkerThread + private fun loadDocumentsList() { + operationInProgress.postValue(true) - coreContext.postOnCoreThread { - val list = arrayListOf() - if (::chatRoom.isInitialized) { - Log.i( - "$TAG Loading document contents for conversation [${LinphoneUtils.getChatRoomId( - chatRoom - )}]" - ) - val documents = chatRoom.documentContents - Log.i("$TAG [${documents.size}] documents have been fetched") - for (documentContent in documents) { - val path = documentContent.filePath.orEmpty() - val name = documentContent.name.orEmpty() - val size = documentContent.size.toLong() - if (path.isNotEmpty() && name.isNotEmpty()) { - val model = FileModel(path, name, size) { - openDocumentEvent.postValue(Event(it)) - } - list.add(model) - } + val list = arrayListOf() + Log.i( + "$TAG Loading document contents for conversation [${LinphoneUtils.getChatRoomId( + chatRoom + )}]" + ) + val documents = chatRoom.documentContents + Log.i("$TAG [${documents.size}] documents have been fetched") + for (documentContent in documents) { + val path = documentContent.filePath.orEmpty() + val name = documentContent.name.orEmpty() + val size = documentContent.size.toLong() + if (path.isNotEmpty() && name.isNotEmpty()) { + val model = FileModel(path, name, size) { + openDocumentEvent.postValue(Event(it)) } - Log.i("$TAG [${documents.size}] documents have been processed") + list.add(model) } - - documentsList.postValue(list) - operationInProgress.postValue(false) } + Log.i("$TAG [${documents.size}] documents have been processed") + + documentsList.postValue(list) + operationInProgress.postValue(false) } } 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 b57260b24..16d7cc8d2 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 @@ -23,7 +23,6 @@ import android.view.View import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.Address @@ -44,7 +43,7 @@ import org.linphone.utils.Event import org.linphone.utils.ImageUtils import org.linphone.utils.LinphoneUtils -class ConversationInfoViewModel @UiThread constructor() : ViewModel() { +class ConversationInfoViewModel @UiThread constructor() : AbstractConversationViewModel() { companion object { private const val TAG = "[Conversation Info ViewModel]" } @@ -69,8 +68,6 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { val expandParticipants = MutableLiveData() - val chatRoomFoundEvent = MutableLiveData>() - val oneToOneParticipantRefKey = MutableLiveData() val groupLeftEvent: MutableLiveData> by lazy { @@ -101,8 +98,6 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { MutableLiveData>>() } - private lateinit var chatRoom: ChatRoom - private val chatRoomListener = object : ChatRoomListenerStub() { @WorkerThread override fun onParticipantAdded(chatRoom: ChatRoom, eventLog: EventLog) { @@ -220,72 +215,23 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { super.onCleared() coreContext.postOnCoreThread { - if (::chatRoom.isInitialized) { + if (isChatRoomInitialized()) { chatRoom.removeListener(chatRoomListener) } } } - @UiThread - fun findChatRoom(room: ChatRoom?, localSipUri: String, remoteSipUri: String) { - coreContext.postOnCoreThread { core -> - Log.i( - "$TAG Looking for conversation with local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" - ) - if (room != null && ::chatRoom.isInitialized && chatRoom == room) { - Log.i("$TAG Conversation object already in memory, skipping") - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - - val localAddress = Factory.instance().createAddress(localSipUri) - val remoteAddress = Factory.instance().createAddress(remoteSipUri) - - if (room != null && (!::chatRoom.isInitialized || chatRoom != room)) { - if (localAddress?.weakEqual(room.localAddress) == true && remoteAddress?.weakEqual( - room.peerAddress - ) == true - ) { - Log.i("$TAG Conversation object available in sharedViewModel, using it") - chatRoom = room - chatRoom.addListener(chatRoomListener) - configureChatRoom() - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - } - - if (localAddress != null && remoteAddress != null) { - Log.i("$TAG Searching for conversation in Core using local & peer SIP addresses") - val found = core.searchChatRoom( - null, - localAddress, - remoteAddress, - arrayOfNulls( - 0 - ) - ) - if (found != null) { - chatRoom = found - chatRoom.addListener(chatRoomListener) - - configureChatRoom() - chatRoomFoundEvent.postValue(Event(true)) - } else { - Log.e("$TAG Failed to find conversation given local & remote addresses!") - chatRoomFoundEvent.postValue(Event(false)) - } - } else { - Log.e("$TAG Failed to parse local or remote SIP URI as Address!") - chatRoomFoundEvent.postValue(Event(false)) - } + override fun beforeNotifyingChatRoomFound(sameOne: Boolean) { + if (!sameOne) { + chatRoom.addListener(chatRoomListener) + configureChatRoom() } } @UiThread fun leaveGroup() { coreContext.postOnCoreThread { - if (::chatRoom.isInitialized) { + if (isChatRoomInitialized()) { Log.i("$TAG Leaving conversation [${LinphoneUtils.getChatRoomId(chatRoom)}]") chatRoom.leave() } @@ -297,7 +243,7 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { fun deleteHistory() { coreContext.postOnCoreThread { // TODO: confirmation dialog ? - if (::chatRoom.isInitialized) { + if (isChatRoomInitialized()) { Log.i( "$TAG Cleaning conversation [${LinphoneUtils.getChatRoomId(chatRoom)}] history" ) @@ -428,7 +374,7 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { @UiThread fun addParticipants(toAdd: ArrayList) { coreContext.postOnCoreThread { - if (::chatRoom.isInitialized) { + if (isChatRoomInitialized()) { if (!LinphoneUtils.isChatRoomAGroup(chatRoom)) { Log.e("$TAG Can't add participants to a conversation that's not a group!") return@postOnCoreThread @@ -462,7 +408,7 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { @UiThread fun updateSubject(newSubject: String) { coreContext.postOnCoreThread { - if (::chatRoom.isInitialized) { + if (isChatRoomInitialized()) { Log.i("$TAG Updating conversation subject to [$newSubject]") chatRoom.subject = newSubject } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationMediaListViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationMediaListViewModel.kt index 5cae2cb26..ccfc0c060 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationMediaListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationMediaListViewModel.kt @@ -20,17 +20,14 @@ package org.linphone.ui.main.chat.viewmodel import androidx.annotation.UiThread +import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.core.ChatRoom -import org.linphone.core.Factory import org.linphone.core.tools.Log import org.linphone.ui.main.chat.model.FileModel import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class ConversationMediaListViewModel @UiThread constructor() : ViewModel() { +class ConversationMediaListViewModel @UiThread constructor() : AbstractConversationViewModel() { companion object { private const val TAG = "[Conversation Media List ViewModel]" } @@ -43,98 +40,40 @@ class ConversationMediaListViewModel @UiThread constructor() : ViewModel() { val operationInProgress = MutableLiveData() - val chatRoomFoundEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - val openMediaEvent: MutableLiveData> by lazy { MutableLiveData>() } - private lateinit var chatRoom: ChatRoom - - lateinit var localSipUri: String - - lateinit var remoteSipUri: String - - @UiThread - fun findChatRoom(room: ChatRoom?, localSipUri: String, remoteSipUri: String) { - this.localSipUri = localSipUri - this.remoteSipUri = remoteSipUri - - coreContext.postOnCoreThread { core -> - Log.i( - "$TAG Looking for conversation with local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" - ) - if (room != null && ::chatRoom.isInitialized && chatRoom == room) { - Log.i("$TAG Conversation object already in memory, skipping") - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - - val localAddress = Factory.instance().createAddress(localSipUri) - val remoteAddress = Factory.instance().createAddress(remoteSipUri) - - if (room != null && (!::chatRoom.isInitialized || chatRoom != room)) { - if (localAddress?.weakEqual(room.localAddress) == true && remoteAddress?.weakEqual( - room.peerAddress - ) == true - ) { - Log.i("$TAG Conversation object available in sharedViewModel, using it") - chatRoom = room - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - } - - if (localAddress != null && remoteAddress != null) { - Log.i("$TAG Searching for conversation in Core using local & peer SIP addresses") - val found = core.searchChatRoom( - null, - localAddress, - remoteAddress, - arrayOfNulls( - 0 - ) - ) - if (found != null) { - chatRoom = found - chatRoomFoundEvent.postValue(Event(true)) - } - } - } + override fun beforeNotifyingChatRoomFound(sameOne: Boolean) { + loadMediaList() } - @UiThread - fun loadMediaList() { - operationInProgress.value = true + @WorkerThread + private fun loadMediaList() { + operationInProgress.postValue(true) - coreContext.postOnCoreThread { - val list = arrayListOf() - if (::chatRoom.isInitialized) { - Log.i( - "$TAG Loading media contents for conversation [${LinphoneUtils.getChatRoomId( - chatRoom - )}]" - ) - val media = chatRoom.mediaContents - Log.i("$TAG [${media.size}] media have been fetched") - for (mediaContent in media) { - val path = mediaContent.filePath.orEmpty() - val name = mediaContent.name.orEmpty() - val size = mediaContent.size.toLong() - if (path.isNotEmpty() && name.isNotEmpty()) { - val model = FileModel(path, name, size) { - openMediaEvent.postValue(Event(it)) - } - list.add(model) - } + val list = arrayListOf() + Log.i( + "$TAG Loading media contents for conversation [${LinphoneUtils.getChatRoomId( + chatRoom + )}]" + ) + val media = chatRoom.mediaContents + Log.i("$TAG [${media.size}] media have been fetched") + for (mediaContent in media) { + val path = mediaContent.filePath.orEmpty() + val name = mediaContent.name.orEmpty() + val size = mediaContent.size.toLong() + if (path.isNotEmpty() && name.isNotEmpty()) { + val model = FileModel(path, name, size) { + openMediaEvent.postValue(Event(it)) } - Log.i("$TAG [${media.size}] media have been processed") + list.add(model) } - - mediaList.postValue(list) - operationInProgress.postValue(false) } + Log.i("$TAG [${media.size}] media have been processed") + + mediaList.postValue(list) + operationInProgress.postValue(false) } } 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 ac6c2b6ab..21c5b1c3e 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 @@ -22,7 +22,6 @@ package org.linphone.ui.main.chat.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.Address @@ -47,7 +46,7 @@ import org.linphone.utils.Event import org.linphone.utils.ImageUtils import org.linphone.utils.LinphoneUtils -class ConversationViewModel @UiThread constructor() : ViewModel() { +class ConversationViewModel @UiThread constructor() : AbstractConversationViewModel() { companion object { private const val TAG = "[Conversation ViewModel]" private const val MESSAGES_PER_PAGE = 30 @@ -114,14 +113,6 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { MutableLiveData>>() } - val chatRoomFoundEvent = MutableLiveData>() - - lateinit var chatRoom: ChatRoom - - lateinit var localSipUri: String - - lateinit var remoteSipUri: String - private var eventsList = arrayListOf() private val chatRoomListener = object : ChatRoomListenerStub() { @@ -330,13 +321,20 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { super.onCleared() coreContext.postOnCoreThread { - if (::chatRoom.isInitialized) { + if (isChatRoomInitialized()) { chatRoom.removeListener(chatRoomListener) } eventsList.forEach(EventLogModel::destroy) } } + override fun beforeNotifyingChatRoomFound(sameOne: Boolean) { + if (!sameOne) { + chatRoom.addListener(chatRoomListener) + configureChatRoom() + } + } + @UiThread fun openSearchBar() { searchBarVisible.value = true @@ -355,65 +353,6 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { searchFilter.value = "" } - @UiThread - fun findChatRoom(room: ChatRoom?, localSipUri: String, remoteSipUri: String) { - this.localSipUri = localSipUri - this.remoteSipUri = remoteSipUri - - coreContext.postOnCoreThread { core -> - Log.i( - "$TAG Looking for conversation with local SIP URI [$localSipUri] and remote SIP URI [$remoteSipUri]" - ) - if (room != null && ::chatRoom.isInitialized && chatRoom == room) { - Log.i("$TAG Conversation object already in memory, skipping") - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - - val localAddress = Factory.instance().createAddress(localSipUri) - val remoteAddress = Factory.instance().createAddress(remoteSipUri) - - if (room != null && (!::chatRoom.isInitialized || chatRoom != room)) { - if (localAddress?.weakEqual(room.localAddress) == true && remoteAddress?.weakEqual( - room.peerAddress - ) == true - ) { - Log.i("$TAG Conversation object available in sharedViewModel, using it") - chatRoom = room - chatRoom.addListener(chatRoomListener) - configureChatRoom() - chatRoomFoundEvent.postValue(Event(true)) - return@postOnCoreThread - } - } - - if (localAddress != null && remoteAddress != null) { - Log.i("$TAG Searching for conversation in Core using local & peer SIP addresses") - val found = core.searchChatRoom( - null, - localAddress, - remoteAddress, - arrayOfNulls( - 0 - ) - ) - if (found != null) { - chatRoom = found - chatRoom.addListener(chatRoomListener) - - configureChatRoom() - chatRoomFoundEvent.postValue(Event(true)) - } else { - Log.e("$TAG Failed to find conversation given local & remote addresses!") - chatRoomFoundEvent.postValue(Event(false)) - } - } else { - Log.e("$TAG Failed to parse local or remote SIP URI as Address!") - chatRoomFoundEvent.postValue(Event(false)) - } - } - } - @UiThread fun refresh() { coreContext.postOnCoreThread { diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt index 25dbfeeb4..09add8ec0 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt @@ -102,12 +102,6 @@ class MediaListViewerFragment : GenericFragment() { val chatRoom = sharedViewModel.displayedChatRoom viewModel.findChatRoom(chatRoom, localSipUri, remoteSipUri) - viewModel.chatRoomFoundEvent.observe(viewLifecycleOwner) { - it.consume { - viewModel.loadMediaList() - } - } - viewModel.mediaList.observe(viewLifecycleOwner) { val count = it.size Log.i(