From 1eabce5220285c07737950eeb1b884c57f9ce96b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 7 Apr 2021 10:20:00 +0200 Subject: [PATCH] Rework to rename classes that weren't real view models to avoid confusion and have a proper cleaning --- .../chat/adapters/ChatMessagesListAdapter.kt | 18 ++++-- .../ChatRoomCreationContactsAdapter.kt | 6 +- .../adapters/GroupInfoParticipantsAdapter.kt | 10 ++- .../main/chat/adapters/ImdnAdapter.kt | 10 ++- .../ChatMessageAttachmentData.kt} | 22 ++++--- .../ChatMessageContentData.kt} | 22 +++---- .../ChatMessageData.kt} | 58 +++++------------ .../ChatRoomCreationContactData.kt} | 13 +--- .../DevicesListChildData.kt} | 5 +- .../DevicesListGroupData.kt} | 12 ++-- .../EphemeralDurationData.kt} | 8 +-- .../EventViewModel.kt => data/EventData.kt} | 5 +- .../GroupInfoParticipantData.kt} | 6 +- .../ImdnParticipantData.kt} | 6 +- .../viewmodels/ChatMessageSendingViewModel.kt | 18 ++++-- .../main/chat/viewmodels/ChatRoomViewModel.kt | 4 +- .../chat/viewmodels/DevicesListViewModel.kt | 13 ++-- .../chat/viewmodels/EphemeralViewModel.kt | 18 +++--- .../main/chat/viewmodels/ImdnViewModel.kt | 3 +- .../viewmodels/ContactEditorViewModel.kt | 2 +- .../contact/viewmodels/ContactViewModel.kt | 4 +- .../linphone/contact/BigContactAvatarView.kt | 2 +- .../org/linphone/contact/ContactAvatarView.kt | 2 +- .../linphone/contact/GenericContactData.kt | 63 +++++++++++++++++++ .../contact/GenericContactViewModel.kt | 15 +---- .../java/org/linphone/core/CoreContext.kt | 37 +++++++++++ .../main/res/layout/chat_event_list_cell.xml | 2 +- .../layout/chat_message_attachment_cell.xml | 2 +- .../res/layout/chat_message_content_cell.xml | 2 +- .../res/layout/chat_message_list_cell.xml | 2 +- .../chat_room_creation_contact_cell.xml | 2 +- .../layout/chat_room_devices_child_cell.xml | 2 +- .../layout/chat_room_devices_group_cell.xml | 2 +- .../chat_room_ephemeral_duration_cell.xml | 2 +- .../chat_room_group_info_participant_cell.xml | 2 +- .../chat_room_imdn_participant_cell.xml | 2 +- 36 files changed, 242 insertions(+), 160 deletions(-) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/ChatMessageAttachmentViewModel.kt => data/ChatMessageAttachmentData.kt} (81%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/ChatMessageContentViewModel.kt => data/ChatMessageContentData.kt} (93%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/ChatMessageViewModel.kt => data/ChatMessageData.kt} (79%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/ChatRoomCreationContactViewModel.kt => data/ChatRoomCreationContactData.kt} (85%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/DevicesListChildViewModel.kt => data/DevicesListChildData.kt} (90%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/DevicesListGroupViewModel.kt => data/DevicesListGroupData.kt} (85%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/EphemeralDurationViewModel.kt => data/EphemeralDurationData.kt} (89%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/EventViewModel.kt => data/EventData.kt} (97%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/GroupInfoParticipantViewModel.kt => data/GroupInfoParticipantData.kt} (86%) rename app/src/main/java/org/linphone/activities/main/chat/{viewmodels/ImdnParticipantViewModel.kt => data/ImdnParticipantData.kt} (81%) create mode 100644 app/src/main/java/org/linphone/contact/GenericContactData.kt 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 87a75e65f..de25ba9d1 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 @@ -34,9 +34,9 @@ import androidx.recyclerview.widget.RecyclerView import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.main.adapters.SelectionListAdapter -import org.linphone.activities.main.chat.viewmodels.ChatMessageViewModel -import org.linphone.activities.main.chat.viewmodels.EventViewModel -import org.linphone.activities.main.chat.viewmodels.OnContentClickedListener +import org.linphone.activities.main.chat.data.ChatMessageData +import org.linphone.activities.main.chat.data.EventData +import org.linphone.activities.main.chat.data.OnContentClickedListener import org.linphone.activities.main.viewmodels.ListTopBarViewModel import org.linphone.core.ChatMessage import org.linphone.core.ChatRoomCapabilities @@ -117,6 +117,12 @@ class ChatMessagesListAdapter( } } + override fun onViewRecycled(holder: RecyclerView.ViewHolder) { + when (holder) { + is ChatMessageViewHolder -> holder.binding.viewModel?.destroy() + } + } + override fun getItemViewType(position: Int): Int { val eventLog = getItem(position) return eventLog.type.toInt() @@ -127,14 +133,14 @@ class ChatMessagesListAdapter( } inner class ChatMessageViewHolder( - private val binding: ChatMessageListCellBinding + val binding: ChatMessageListCellBinding ) : RecyclerView.ViewHolder(binding.root), PopupMenu.OnMenuItemClickListener { fun bind(eventLog: EventLog) { with(binding) { if (eventLog.type == EventLog.Type.ConferenceChatMessage) { val chatMessage = eventLog.chatMessage chatMessage ?: return - val chatMessageViewModel = ChatMessageViewModel(chatMessage, contentClickedListener) + val chatMessageViewModel = ChatMessageData(chatMessage, contentClickedListener) viewModel = chatMessageViewModel lifecycleOwner = viewLifecycleOwner @@ -298,7 +304,7 @@ class ChatMessagesListAdapter( ) : RecyclerView.ViewHolder(binding.root) { fun bind(eventLog: EventLog) { with(binding) { - val eventViewModel = EventViewModel(eventLog) + val eventViewModel = EventData(eventLog) viewModel = eventViewModel binding.lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomCreationContactsAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomCreationContactsAdapter.kt index a77f07fe7..830806546 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomCreationContactsAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomCreationContactsAdapter.kt @@ -29,7 +29,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R -import org.linphone.activities.main.chat.viewmodels.ChatRoomCreationContactViewModel +import org.linphone.activities.main.chat.data.ChatRoomCreationContactData import org.linphone.core.Address import org.linphone.core.FriendCapability import org.linphone.core.SearchResult @@ -74,7 +74,7 @@ class ChatRoomCreationContactsAdapter( ) : RecyclerView.ViewHolder(binding.root) { fun bind(searchResult: SearchResult) { with(binding) { - val searchResultViewModel = ChatRoomCreationContactViewModel(searchResult) + val searchResultViewModel = ChatRoomCreationContactData(searchResult) viewModel = searchResultViewModel lifecycleOwner = viewLifecycleOwner @@ -97,7 +97,7 @@ class ChatRoomCreationContactsAdapter( private fun updateSecurity( searchResult: SearchResult, - viewModel: ChatRoomCreationContactViewModel, + viewModel: ChatRoomCreationContactData, securityEnabled: Boolean ) { val searchAddress = searchResult.address diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/GroupInfoParticipantsAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/GroupInfoParticipantsAdapter.kt index b5cb26615..1e52b7dea 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/GroupInfoParticipantsAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/GroupInfoParticipantsAdapter.kt @@ -29,7 +29,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.linphone.R import org.linphone.activities.main.chat.GroupChatRoomMember -import org.linphone.activities.main.chat.viewmodels.GroupInfoParticipantViewModel +import org.linphone.activities.main.chat.data.GroupInfoParticipantData import org.linphone.databinding.ChatRoomGroupInfoParticipantCellBinding import org.linphone.utils.Event @@ -55,17 +55,21 @@ class GroupInfoParticipantsAdapter( (holder as ViewHolder).bind(getItem(position)) } + override fun onViewRecycled(holder: RecyclerView.ViewHolder) { + (holder as ViewHolder).binding.viewModel?.destroy() + } + fun showAdminControls(show: Boolean) { showAdmin = show notifyDataSetChanged() } inner class ViewHolder( - private val binding: ChatRoomGroupInfoParticipantCellBinding + val binding: ChatRoomGroupInfoParticipantCellBinding ) : RecyclerView.ViewHolder(binding.root) { fun bind(participant: GroupChatRoomMember) { with(binding) { - val participantViewModel = GroupInfoParticipantViewModel(participant) + val participantViewModel = GroupInfoParticipantData(participant) participantViewModel.showAdminControls.value = showAdmin viewModel = participantViewModel diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ImdnAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ImdnAdapter.kt index f55341540..c756bbad2 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ImdnAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ImdnAdapter.kt @@ -29,7 +29,7 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import org.linphone.R -import org.linphone.activities.main.chat.viewmodels.ImdnParticipantViewModel +import org.linphone.activities.main.chat.data.ImdnParticipantData import org.linphone.core.ChatMessage import org.linphone.core.ParticipantImdnState import org.linphone.databinding.ChatRoomImdnParticipantCellBinding @@ -51,12 +51,16 @@ class ImdnAdapter( (holder as ViewHolder).bind(getItem(position)) } + override fun onViewRecycled(holder: RecyclerView.ViewHolder) { + (holder as ViewHolder).binding.viewModel?.destroy() + } + inner class ViewHolder( - private val binding: ChatRoomImdnParticipantCellBinding + val binding: ChatRoomImdnParticipantCellBinding ) : RecyclerView.ViewHolder(binding.root) { fun bind(participantImdnState: ParticipantImdnState) { with(binding) { - viewModel = ImdnParticipantViewModel(participantImdnState) + viewModel = ImdnParticipantData(participantImdnState) lifecycleOwner = viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageAttachmentViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageAttachmentData.kt similarity index 81% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageAttachmentViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageAttachmentData.kt index 070491746..22c6b8235 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageAttachmentViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageAttachmentData.kt @@ -17,30 +17,28 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data import android.graphics.Bitmap import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import org.linphone.utils.FileUtils import org.linphone.utils.ImageUtils -class ChatMessageAttachmentViewModel( +class ChatMessageAttachmentData( val path: String, - private val deleteCallback: (attachment: ChatMessageAttachmentViewModel) -> Unit -) : ViewModel() { + private val deleteCallback: (attachment: ChatMessageAttachmentData) -> Unit +) { val fileName: String = FileUtils.getNameFromFilePath(path) val isImage: Boolean = FileUtils.isExtensionImage(path) val isVideo: Boolean = FileUtils.isExtensionVideo(path) val videoPreview = MutableLiveData() + private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) + init { if (isVideo) { - viewModelScope.launch { + scope.launch { withContext(Dispatchers.IO) { videoPreview.postValue(ImageUtils.getVideoPreview(path)) } @@ -48,6 +46,10 @@ class ChatMessageAttachmentViewModel( } } + fun destroy() { + scope.cancel() + } + fun delete() { deleteCallback(this) } 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/data/ChatMessageContentData.kt similarity index 93% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt index 7d18a1180..3df297f04 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageContentViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt @@ -17,15 +17,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data import android.graphics.Bitmap import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import org.linphone.core.ChatMessage import org.linphone.core.ChatMessageListenerStub import org.linphone.core.Content @@ -34,11 +30,11 @@ import org.linphone.utils.AppUtils import org.linphone.utils.FileUtils import org.linphone.utils.ImageUtils -class ChatMessageContentViewModel( +class ChatMessageContentData( val content: Content, private val chatMessage: ChatMessage, private val listener: OnContentClickedListener? -) : ViewModel() { +) { val isImage = MutableLiveData() val isVideo = MutableLiveData() val isAudio = MutableLiveData() @@ -89,6 +85,8 @@ class ChatMessageContentViewModel( } } + private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) + init { filePath.value = "" fileName.value = if (content.name.isNullOrEmpty() && !content.filePath.isNullOrEmpty()) { @@ -110,7 +108,7 @@ class ChatMessageContentViewModel( isAudio.value = FileUtils.isExtensionAudio(path) if (isVideo.value == true) { - viewModelScope.launch { + scope.launch { withContext(Dispatchers.IO) { videoPreview.postValue(ImageUtils.getVideoPreview(path)) } @@ -134,15 +132,15 @@ class ChatMessageContentViewModel( chatMessage.addListener(chatMessageListener) } - override fun onCleared() { + fun destroy() { + scope.cancel() + val path = filePath.value.orEmpty() if (content.isFileEncrypted && path.isNotEmpty()) { Log.i("[Content] Deleting file used for preview: $path") FileUtils.deleteFile(path) filePath.value = "" } - - super.onCleared() } fun download() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt similarity index 79% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt index 9bc0ede78..1de966ea7 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageData.kt @@ -17,20 +17,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data import android.os.CountDownTimer import android.text.Spannable import android.text.util.Linkify import androidx.core.text.util.LinkifyCompat import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.* import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R -import org.linphone.compatibility.Compatibility -import org.linphone.contact.GenericContactViewModel +import org.linphone.contact.GenericContactData import org.linphone.core.ChatMessage import org.linphone.core.ChatMessageListenerStub import org.linphone.core.Content @@ -40,10 +38,10 @@ import org.linphone.utils.AppUtils import org.linphone.utils.PermissionHelper import org.linphone.utils.TimestampUtils -class ChatMessageViewModel( +class ChatMessageData( val chatMessage: ChatMessage, private var contentListener: OnContentClickedListener? = null -) : GenericContactViewModel(chatMessage.fromAddress) { +) : GenericContactData(chatMessage.fromAddress) { val sendInProgress = MutableLiveData() val transferInProgress = MutableLiveData() @@ -58,7 +56,7 @@ class ChatMessageViewModel( val hideTime = MutableLiveData() - val contents = MutableLiveData>() + val contents = MutableLiveData>() val time = MutableLiveData() @@ -76,6 +74,7 @@ class ChatMessageViewModel( // TODO FIXME : find a way to refresh outgoing message downloaded if (state == ChatMessage.State.FileTransferDone && !message.isOutgoing) { Log.i("[Chat Message] File transfer done") + contents.value.orEmpty().forEach(ChatMessageContentData::destroy) updateContentsList() if (!message.isEphemeral && corePreferences.makePublicMediaFilesDownloaded) { @@ -109,11 +108,12 @@ class ChatMessageViewModel( updateContentsList() } - override fun onCleared() { + override fun destroy() { + super.destroy() + + contents.value.orEmpty().forEach(ChatMessageContentData::destroy) chatMessage.removeListener(listener) contentListener = null - - super.onCleared() } fun updateBubbleBackground(hasPrevious: Boolean, hasNext: Boolean) { @@ -164,16 +164,19 @@ class ChatMessageViewModel( } private fun updateContentsList() { - val list = arrayListOf() + contents.value.orEmpty().forEach(ChatMessageContentData::destroy) + + val list = arrayListOf() for (content in chatMessage.contents) { if (content.isFileTransfer || content.isFile) { - list.add(ChatMessageContentViewModel(content, chatMessage, contentListener)) + list.add(ChatMessageContentData(content, chatMessage, contentListener)) } else if (content.isText) { val spannable = Spannable.Factory.getInstance().newSpannable(content.utf8Text) LinkifyCompat.addLinks(spannable, Linkify.WEB_URLS) text.value = spannable } } + contents.value = list } @@ -210,33 +213,6 @@ class ChatMessageViewModel( } private fun addContentToMediaStore(content: Content) { - viewModelScope.launch { - when (content.type) { - "image" -> { - if (Compatibility.addImageToMediaStore(coreContext.context, content)) { - Log.i("[Chat Message] Adding image ${content.name} to Media Store terminated") - } else { - Log.e("[Chat Message] Something went wrong while copying file to Media Store...") - } - } - "video" -> { - if (Compatibility.addVideoToMediaStore(coreContext.context, content)) { - Log.i("[Chat Message] Adding video ${content.name} to Media Store terminated") - } else { - Log.e("[Chat Message] Something went wrong while copying file to Media Store...") - } - } - "audio" -> { - if (Compatibility.addAudioToMediaStore(coreContext.context, content)) { - Log.i("[Chat Message] Adding audio ${content.name} to Media Store terminated") - } else { - Log.e("[Chat Message] Something went wrong while copying file to Media Store...") - } - } - else -> { - Log.w("[Chat Message] File ${content.name} isn't either an image, an audio file or a video, can't add it to the Media Store") - } - } - } + coreContext.addContentToMediaStore(content) } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationContactViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomCreationContactData.kt similarity index 85% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationContactViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomCreationContactData.kt index f7f67e5c2..6269ee2f5 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationContactViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomCreationContactData.kt @@ -17,17 +17,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.contact.Contact -import org.linphone.contact.ContactViewModelInterface +import org.linphone.contact.ContactDataInterface import org.linphone.core.* import org.linphone.utils.LinphoneUtils -class ChatRoomCreationContactViewModel(private val searchResult: SearchResult) : ViewModel(), ContactViewModelInterface { +class ChatRoomCreationContactData(private val searchResult: SearchResult) : ContactDataInterface { override val contact = MutableLiveData() override val displayName: String by lazy { @@ -58,8 +57,6 @@ class ChatRoomCreationContactViewModel(private val searchResult: SearchResult) : val hasLimeX3DHCapability: Boolean get() = searchResult.hasCapability(FriendCapability.LimeX3Dh) - var listener: ChatRoomCreationContactSelectionListener? = null - init { isDisabled.value = false isSelected.value = false @@ -75,7 +72,3 @@ class ChatRoomCreationContactViewModel(private val searchResult: SearchResult) : } } } - -interface ChatRoomCreationContactSelectionListener { - fun onUnSelected(searchResult: SearchResult) -} diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListChildViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListChildData.kt similarity index 90% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListChildViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/DevicesListChildData.kt index 845cb9988..d4a51b937 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListChildViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListChildData.kt @@ -17,15 +17,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.ChatRoomSecurityLevel import org.linphone.core.ParticipantDevice -class DevicesListChildViewModel(private val device: ParticipantDevice) : ViewModel() { +class DevicesListChildData(private val device: ParticipantDevice) { val deviceName: String = device.name.orEmpty() val securityLevelIcon: Int by lazy { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListGroupViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListGroupData.kt similarity index 85% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListGroupViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/DevicesListGroupData.kt index 714ddfe40..4b10283bd 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListGroupViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListGroupData.kt @@ -17,17 +17,17 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R -import org.linphone.contact.GenericContactViewModel +import org.linphone.contact.GenericContactData import org.linphone.core.ChatRoomSecurityLevel import org.linphone.core.Participant import org.linphone.utils.LinphoneUtils -class DevicesListGroupViewModel(private val participant: Participant) : GenericContactViewModel(participant.address) { +class DevicesListGroupData(private val participant: Participant) : GenericContactData(participant.address) { override val securityLevel: ChatRoomSecurityLevel get() = participant.securityLevel @@ -53,14 +53,14 @@ class DevicesListGroupViewModel(private val participant: Participant) : GenericC val isExpanded = MutableLiveData() - val devices = MutableLiveData>() + val devices = MutableLiveData>() init { isExpanded.value = false - val list = arrayListOf() + val list = arrayListOf() for (device in participant.devices) { - list.add(DevicesListChildViewModel((device))) + list.add(DevicesListChildData((device))) } devices.value = list } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EphemeralDurationViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/EphemeralDurationData.kt similarity index 89% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/EphemeralDurationViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/EphemeralDurationData.kt index c5221742f..ddf6b1d68 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EphemeralDurationViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/EphemeralDurationData.kt @@ -17,16 +17,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data -import androidx.lifecycle.ViewModel - -class EphemeralDurationViewModel( +class EphemeralDurationData( val textResource: Int, selectedDuration: Long, private val duration: Long, private val listener: DurationItemClicked -) : ViewModel() { +) { val selected: Boolean = selectedDuration == duration fun setSelected() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EventViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/EventData.kt similarity index 97% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/EventViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/EventData.kt index d4ac0fa48..d87e0bbf1 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EventViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/EventData.kt @@ -17,11 +17,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data import android.content.Context import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.contact.Contact @@ -29,7 +28,7 @@ import org.linphone.core.EventLog import org.linphone.core.tools.Log import org.linphone.utils.LinphoneUtils -class EventViewModel(private val eventLog: EventLog) : ViewModel() { +class EventData(private val eventLog: EventLog) { val text = MutableLiveData() val isSecurity: Boolean by lazy { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoParticipantViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/GroupInfoParticipantData.kt similarity index 86% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoParticipantViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/GroupInfoParticipantData.kt index 9e1d8d20f..19bf3fbe0 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoParticipantViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/GroupInfoParticipantData.kt @@ -17,15 +17,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data import androidx.lifecycle.MutableLiveData import org.linphone.activities.main.chat.GroupChatRoomMember -import org.linphone.contact.GenericContactViewModel +import org.linphone.contact.GenericContactData import org.linphone.core.ChatRoomSecurityLevel import org.linphone.utils.LinphoneUtils -class GroupInfoParticipantViewModel(private val participant: GroupChatRoomMember) : GenericContactViewModel(participant.address) { +class GroupInfoParticipantData(private val participant: GroupChatRoomMember) : GenericContactData(participant.address) { override val securityLevel: ChatRoomSecurityLevel get() = participant.securityLevel diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ImdnParticipantViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ImdnParticipantData.kt similarity index 81% rename from app/src/main/java/org/linphone/activities/main/chat/viewmodels/ImdnParticipantViewModel.kt rename to app/src/main/java/org/linphone/activities/main/chat/data/ImdnParticipantData.kt index 915a27335..df6854685 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ImdnParticipantViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ImdnParticipantData.kt @@ -17,13 +17,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.linphone.activities.main.chat.viewmodels +package org.linphone.activities.main.chat.data -import org.linphone.contact.GenericContactViewModel +import org.linphone.contact.GenericContactData import org.linphone.core.ParticipantImdnState import org.linphone.utils.TimestampUtils -class ImdnParticipantViewModel(imdnState: ParticipantImdnState) : GenericContactViewModel(imdnState.participant.address) { +class ImdnParticipantData(imdnState: ParticipantImdnState) : GenericContactData(imdnState.participant.address) { val sipUri: String = imdnState.participant.address.asStringUriOnly() val time: String = TimestampUtils.toString(imdnState.stateChangeTime) diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt index 3f69ad17d..654b53502 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt @@ -24,6 +24,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import java.io.File import org.linphone.LinphoneApplication.Companion.corePreferences +import org.linphone.activities.main.chat.data.ChatMessageAttachmentData import org.linphone.core.ChatMessage import org.linphone.core.ChatRoom import org.linphone.core.ChatRoomCapabilities @@ -42,7 +43,7 @@ class ChatMessageSendingViewModelFactory(private val chatRoom: ChatRoom) : class ChatMessageSendingViewModel(private val chatRoom: ChatRoom) : ViewModel() { var temporaryFileUploadPath: File? = null - val attachments = MutableLiveData>() + val attachments = MutableLiveData>() val attachFileEnabled = MutableLiveData() @@ -60,6 +61,11 @@ class ChatMessageSendingViewModel(private val chatRoom: ChatRoom) : ViewModel() isReadOnly.value = chatRoom.hasBeenLeft() } + override fun onCleared() { + attachments.value.orEmpty().forEach(ChatMessageAttachmentData::destroy) + super.onCleared() + } + fun onTextToSendChanged(value: String) { sendMessageEnabled.value = value.isNotEmpty() || attachments.value?.isNotEmpty() ?: false if (value.isNotEmpty()) { @@ -75,9 +81,9 @@ class ChatMessageSendingViewModel(private val chatRoom: ChatRoom) : ViewModel() } fun addAttachment(path: String) { - val list = arrayListOf() + val list = arrayListOf() list.addAll(attachments.value.orEmpty()) - list.add(ChatMessageAttachmentViewModel(path) { + list.add(ChatMessageAttachmentData(path) { removeAttachment(it) }) attachments.value = list @@ -88,10 +94,11 @@ class ChatMessageSendingViewModel(private val chatRoom: ChatRoom) : ViewModel() } } - private fun removeAttachment(attachment: ChatMessageAttachmentViewModel) { - val list = arrayListOf() + private fun removeAttachment(attachment: ChatMessageAttachmentData) { + val list = arrayListOf() list.addAll(attachments.value.orEmpty()) list.remove(attachment) + attachment.destroy() attachments.value = list sendMessageEnabled.value = textToSend.value.orEmpty().isNotEmpty() || list.isNotEmpty() @@ -137,6 +144,7 @@ class ChatMessageSendingViewModel(private val chatRoom: ChatRoom) : ViewModel() message.send() } + attachments.value.orEmpty().forEach(ChatMessageAttachmentData::destroy) attachments.value = arrayListOf() } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt index 7cc5ec4dc..85f0689d1 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt @@ -25,7 +25,7 @@ import androidx.lifecycle.ViewModelProvider import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.contact.Contact -import org.linphone.contact.ContactViewModelInterface +import org.linphone.contact.ContactDataInterface import org.linphone.contact.ContactsUpdatedListenerStub import org.linphone.core.* import org.linphone.core.tools.Log @@ -42,7 +42,7 @@ class ChatRoomViewModelFactory(private val chatRoom: ChatRoom) : } } -class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactViewModelInterface { +class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterface { override val contact = MutableLiveData() override val displayName: String diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListViewModel.kt index fa31ee0b9..d6618552c 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/DevicesListViewModel.kt @@ -22,6 +22,7 @@ package org.linphone.activities.main.chat.viewmodels import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import org.linphone.activities.main.chat.data.DevicesListGroupData import org.linphone.core.ChatRoom import org.linphone.core.ChatRoomListenerStub import org.linphone.core.EventLog @@ -36,7 +37,7 @@ class DevicesListViewModelFactory(private val chatRoom: ChatRoom) : } class DevicesListViewModel(private val chatRoom: ChatRoom) : ViewModel() { - val participants = MutableLiveData>() + val participants = MutableLiveData>() private val listener = object : ChatRoomListenerStub() { override fun onParticipantDeviceAdded(chatRoom: ChatRoom, eventLog: EventLog) { @@ -62,17 +63,21 @@ class DevicesListViewModel(private val chatRoom: ChatRoom) : ViewModel() { } override fun onCleared() { + participants.value.orEmpty().forEach(DevicesListGroupData::destroy) chatRoom.removeListener(listener) super.onCleared() } private fun updateParticipants() { - val list = arrayListOf() + participants.value.orEmpty().forEach(DevicesListGroupData::destroy) + + val list = arrayListOf() val me = chatRoom.me - if (me != null) list.add(DevicesListGroupViewModel(me)) + if (me != null) list.add(DevicesListGroupData(me)) for (participant in chatRoom.participants) { - list.add(DevicesListGroupViewModel(participant)) + list.add(DevicesListGroupData(participant)) } + participants.value = list } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EphemeralViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EphemeralViewModel.kt index 5f7a14eb4..072e8db76 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EphemeralViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/EphemeralViewModel.kt @@ -23,6 +23,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.linphone.R +import org.linphone.activities.main.chat.data.DurationItemClicked +import org.linphone.activities.main.chat.data.EphemeralDurationData import org.linphone.core.ChatRoom import org.linphone.core.tools.Log @@ -36,7 +38,7 @@ class EphemeralViewModelFactory(private val chatRoom: ChatRoom) : } class EphemeralViewModel(private val chatRoom: ChatRoom) : ViewModel() { - val durationsList = MutableLiveData>() + val durationsList = MutableLiveData>() var currentSelectedDuration: Long = 0 @@ -74,13 +76,13 @@ class EphemeralViewModel(private val chatRoom: ChatRoom) : ViewModel() { } private fun computeEphemeralDurationValues() { - val list = arrayListOf() - list.add(EphemeralDurationViewModel(R.string.chat_room_ephemeral_message_disabled, currentSelectedDuration, 0, listener)) - list.add(EphemeralDurationViewModel(R.string.chat_room_ephemeral_message_one_minute, currentSelectedDuration, 60, listener)) - list.add(EphemeralDurationViewModel(R.string.chat_room_ephemeral_message_one_hour, currentSelectedDuration, 3600, listener)) - list.add(EphemeralDurationViewModel(R.string.chat_room_ephemeral_message_one_day, currentSelectedDuration, 86400, listener)) - list.add(EphemeralDurationViewModel(R.string.chat_room_ephemeral_message_three_days, currentSelectedDuration, 259200, listener)) - list.add(EphemeralDurationViewModel(R.string.chat_room_ephemeral_message_one_week, currentSelectedDuration, 604800, listener)) + val list = arrayListOf() + list.add(EphemeralDurationData(R.string.chat_room_ephemeral_message_disabled, currentSelectedDuration, 0, listener)) + list.add(EphemeralDurationData(R.string.chat_room_ephemeral_message_one_minute, currentSelectedDuration, 60, listener)) + list.add(EphemeralDurationData(R.string.chat_room_ephemeral_message_one_hour, currentSelectedDuration, 3600, listener)) + list.add(EphemeralDurationData(R.string.chat_room_ephemeral_message_one_day, currentSelectedDuration, 86400, listener)) + list.add(EphemeralDurationData(R.string.chat_room_ephemeral_message_three_days, currentSelectedDuration, 259200, listener)) + list.add(EphemeralDurationData(R.string.chat_room_ephemeral_message_one_week, currentSelectedDuration, 604800, listener)) durationsList.value = list } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ImdnViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ImdnViewModel.kt index 7bc782089..9f4403a9e 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ImdnViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ImdnViewModel.kt @@ -22,6 +22,7 @@ package org.linphone.activities.main.chat.viewmodels import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import org.linphone.activities.main.chat.data.ChatMessageData import org.linphone.core.ChatMessage import org.linphone.core.ChatMessageListenerStub import org.linphone.core.ParticipantImdnState @@ -38,7 +39,7 @@ class ImdnViewModelFactory(private val chatMessage: ChatMessage) : class ImdnViewModel(private val chatMessage: ChatMessage) : ViewModel() { val participants = MutableLiveData>() - val chatMessageViewModel = ChatMessageViewModel(chatMessage) + val chatMessageViewModel = ChatMessageData(chatMessage) private val listener = object : ChatMessageListenerStub() { override fun onParticipantImdnStateChanged( diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt index 207b7a82a..3ee0d2a3c 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt @@ -43,7 +43,7 @@ class ContactEditorViewModelFactory(private val contact: Contact?) : } } -class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactViewModelInterface { +class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactDataInterface { override val contact = MutableLiveData() override val displayName: String diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt index 3180ba7e3..f8f54ffb1 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt @@ -29,7 +29,7 @@ import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.main.viewmodels.ErrorReportingViewModel import org.linphone.contact.Contact -import org.linphone.contact.ContactViewModelInterface +import org.linphone.contact.ContactDataInterface import org.linphone.contact.ContactsUpdatedListenerStub import org.linphone.contact.NativeContact import org.linphone.core.* @@ -46,7 +46,7 @@ class ContactViewModelFactory(private val contact: Contact) : } } -class ContactViewModel(private val c: Contact) : ErrorReportingViewModel(), ContactViewModelInterface { +class ContactViewModel(private val c: Contact) : ErrorReportingViewModel(), ContactDataInterface { override val contact = MutableLiveData() override val displayName: String by lazy { diff --git a/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt b/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt index d4510f9a9..524eb927d 100644 --- a/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt +++ b/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt @@ -51,7 +51,7 @@ class BigContactAvatarView : LinearLayout { ) } - fun setViewModel(viewModel: ContactViewModelInterface?) { + fun setViewModel(viewModel: ContactDataInterface?) { if (viewModel == null) { binding.root.visibility = View.GONE return diff --git a/app/src/main/java/org/linphone/contact/ContactAvatarView.kt b/app/src/main/java/org/linphone/contact/ContactAvatarView.kt index cf3cdbe1c..1c40e219f 100644 --- a/app/src/main/java/org/linphone/contact/ContactAvatarView.kt +++ b/app/src/main/java/org/linphone/contact/ContactAvatarView.kt @@ -51,7 +51,7 @@ class ContactAvatarView : LinearLayout { ) } - fun setViewModel(viewModel: ContactViewModelInterface) { + fun setViewModel(viewModel: ContactDataInterface) { val contact: Contact? = viewModel.contact.value val initials = if (contact != null) { AppUtils.getInitials(contact.fullName ?: contact.firstName + " " + contact.lastName) diff --git a/app/src/main/java/org/linphone/contact/GenericContactData.kt b/app/src/main/java/org/linphone/contact/GenericContactData.kt new file mode 100644 index 000000000..8b1b57527 --- /dev/null +++ b/app/src/main/java/org/linphone/contact/GenericContactData.kt @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2010-2021 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.contact + +import androidx.lifecycle.MutableLiveData +import org.linphone.LinphoneApplication +import org.linphone.core.Address +import org.linphone.core.ChatRoomSecurityLevel +import org.linphone.utils.LinphoneUtils + +interface ContactDataInterface { + val contact: MutableLiveData + + val displayName: String + + val securityLevel: ChatRoomSecurityLevel + get() = ChatRoomSecurityLevel.ClearText + + val showGroupChatAvatar: Boolean + get() = false +} + +open class GenericContactData(private val sipAddress: Address) : ContactDataInterface { + override val displayName: String = LinphoneUtils.getDisplayName(sipAddress) + + override val contact = MutableLiveData() + + private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { + override fun onContactUpdated(contact: Contact) { + contactLookup() + } + } + + init { + LinphoneApplication.coreContext.contactsManager.addListener(contactsUpdatedListener) + contactLookup() + } + + open fun destroy() { + LinphoneApplication.coreContext.contactsManager.removeListener(contactsUpdatedListener) + } + + private fun contactLookup() { + contact.value = LinphoneApplication.coreContext.contactsManager.findContactByAddress(sipAddress) + } +} diff --git a/app/src/main/java/org/linphone/contact/GenericContactViewModel.kt b/app/src/main/java/org/linphone/contact/GenericContactViewModel.kt index 6cc6addae..9b694929d 100644 --- a/app/src/main/java/org/linphone/contact/GenericContactViewModel.kt +++ b/app/src/main/java/org/linphone/contact/GenericContactViewModel.kt @@ -23,22 +23,9 @@ import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.activities.main.viewmodels.ErrorReportingViewModel import org.linphone.core.Address -import org.linphone.core.ChatRoomSecurityLevel import org.linphone.utils.LinphoneUtils -interface ContactViewModelInterface { - val contact: MutableLiveData - - val displayName: String - - val securityLevel: ChatRoomSecurityLevel - get() = ChatRoomSecurityLevel.ClearText - - val showGroupChatAvatar: Boolean - get() = false -} - -abstract class GenericContactViewModel(private val sipAddress: Address) : ErrorReportingViewModel(), ContactViewModelInterface { +abstract class GenericContactViewModel(private val sipAddress: Address) : ErrorReportingViewModel(), ContactDataInterface { override val displayName: String = LinphoneUtils.getDisplayName(sipAddress) override val contact = MutableLiveData() diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index e9c8e05f4..d8e2dbbab 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -49,6 +49,7 @@ import javax.crypto.KeyGenerator import javax.crypto.SecretKey import javax.crypto.spec.GCMParameterSpec import kotlin.math.abs +import kotlinx.coroutines.* import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.call.CallActivity @@ -100,6 +101,8 @@ class CoreContext(val context: Context, coreConfig: Config) { private val loggingService = Factory.instance().loggingService + private val coroutineScope = CoroutineScope(Dispatchers.Main + SupervisorJob()) + private var gsmCallActive = false private val phoneStateListener = object : PhoneStateListener() { override fun onCallStateChanged(state: Int, phoneNumber: String?) { @@ -322,6 +325,7 @@ class CoreContext(val context: Context, coreConfig: Config) { fun stop() { Log.i("[Context] Stopping") + coroutineScope.cancel() val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager Log.i("[Context] Unregistering phone state listener") @@ -598,6 +602,39 @@ class CoreContext(val context: Context, coreConfig: Config) { } } + /* Coroutine related */ + + fun addContentToMediaStore(content: Content) { + coroutineScope.launch { + when (content.type) { + "image" -> { + if (Compatibility.addImageToMediaStore(context, content)) { + Log.i("[Context] Adding image ${content.name} to Media Store terminated") + } else { + Log.e("[Context] Something went wrong while copying file to Media Store...") + } + } + "video" -> { + if (Compatibility.addVideoToMediaStore(context, content)) { + Log.i("[Context] Adding video ${content.name} to Media Store terminated") + } else { + Log.e("[Context] Something went wrong while copying file to Media Store...") + } + } + "audio" -> { + if (Compatibility.addAudioToMediaStore(context, content)) { + Log.i("[Context] Adding audio ${content.name} to Media Store terminated") + } else { + Log.e("[Context] Something went wrong while copying file to Media Store...") + } + } + else -> { + Log.w("[Context] File ${content.name} isn't either an image, an audio file or a video, can't add it to the Media Store") + } + } + } + } + /* Start call related activities */ private fun onIncomingReceived() { diff --git a/app/src/main/res/layout/chat_event_list_cell.xml b/app/src/main/res/layout/chat_event_list_cell.xml index 9bfc28806..006eeeef5 100644 --- a/app/src/main/res/layout/chat_event_list_cell.xml +++ b/app/src/main/res/layout/chat_event_list_cell.xml @@ -11,7 +11,7 @@ type="android.view.View.OnClickListener" /> + type="org.linphone.activities.main.chat.data.EventData" /> diff --git a/app/src/main/res/layout/chat_message_attachment_cell.xml b/app/src/main/res/layout/chat_message_attachment_cell.xml index bbed191ba..328b66b36 100644 --- a/app/src/main/res/layout/chat_message_attachment_cell.xml +++ b/app/src/main/res/layout/chat_message_attachment_cell.xml @@ -6,7 +6,7 @@ + type="org.linphone.activities.main.chat.data.ChatMessageAttachmentData" /> + type="org.linphone.activities.main.chat.data.ChatMessageContentData" /> diff --git a/app/src/main/res/layout/chat_message_list_cell.xml b/app/src/main/res/layout/chat_message_list_cell.xml index 035713ada..7537f9f67 100644 --- a/app/src/main/res/layout/chat_message_list_cell.xml +++ b/app/src/main/res/layout/chat_message_list_cell.xml @@ -18,7 +18,7 @@ type="Integer"/> + type="org.linphone.activities.main.chat.data.ChatMessageData" /> diff --git a/app/src/main/res/layout/chat_room_creation_contact_cell.xml b/app/src/main/res/layout/chat_room_creation_contact_cell.xml index c8bbcc123..e58703c68 100644 --- a/app/src/main/res/layout/chat_room_creation_contact_cell.xml +++ b/app/src/main/res/layout/chat_room_creation_contact_cell.xml @@ -10,7 +10,7 @@ type="android.view.View.OnClickListener"/> + type="org.linphone.activities.main.chat.data.ChatRoomCreationContactData" /> + type="org.linphone.activities.main.chat.data.DevicesListChildData" /> + type="org.linphone.activities.main.chat.data.DevicesListGroupData" /> + type="org.linphone.activities.main.chat.data.EphemeralDurationData" /> + type="org.linphone.activities.main.chat.data.GroupInfoParticipantData" /> diff --git a/app/src/main/res/layout/chat_room_imdn_participant_cell.xml b/app/src/main/res/layout/chat_room_imdn_participant_cell.xml index 64beba99a..a0cd147ef 100644 --- a/app/src/main/res/layout/chat_room_imdn_participant_cell.xml +++ b/app/src/main/res/layout/chat_room_imdn_participant_cell.xml @@ -7,7 +7,7 @@ + type="org.linphone.activities.main.chat.data.ImdnParticipantData" />