From 0415629299e2036c401f5fbeef7b3114154cc8e9 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 7 Jun 2021 00:13:52 +0200 Subject: [PATCH] Fixed chat room scroll freeze + system overlay on some launchers + reduce multi contents in chat bubble size --- .../chat/adapters/ChatRoomsListAdapter.kt | 24 +++--- .../chat/fragments/MasterChatRoomsFragment.kt | 16 ++-- .../main/chat/viewmodels/ChatRoomViewModel.kt | 13 ++- .../chat/viewmodels/ChatRoomsListViewModel.kt | 80 +++++++++++-------- .../java/org/linphone/core/CoreContext.kt | 5 +- app/src/main/res/values/dimen.xml | 2 +- 6 files changed, 78 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt index 78d7e4d49..260b60290 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt @@ -37,7 +37,7 @@ import org.linphone.utils.Event class ChatRoomsListAdapter( selectionVM: ListTopBarViewModel, private val viewLifecycleOwner: LifecycleOwner -) : SelectionListAdapter(selectionVM, ChatRoomDiffCallback()) { +) : SelectionListAdapter(selectionVM, ChatRoomDiffCallback()) { val selectedChatRoomEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -64,9 +64,8 @@ class ChatRoomsListAdapter( inner class ViewHolder( private val binding: ChatRoomListCellBinding ) : RecyclerView.ViewHolder(binding.root) { - fun bind(chatRoom: ChatRoom) { + fun bind(chatRoomViewModel: ChatRoomViewModel) { with(binding) { - val chatRoomViewModel = ChatRoomViewModel(chatRoom) viewModel = chatRoomViewModel lifecycleOwner = viewLifecycleOwner @@ -83,8 +82,8 @@ class ChatRoomsListAdapter( if (selectionViewModel.isEditionEnabled.value == true) { selectionViewModel.onToggleSelect(adapterPosition) } else { - selectedChatRoomEvent.value = Event(chatRoom) - chatRoom.markAsRead() + selectedChatRoomEvent.value = Event(chatRoomViewModel.chatRoom) + chatRoomViewModel.chatRoom.markAsRead() } } @@ -103,19 +102,18 @@ class ChatRoomsListAdapter( } } -private class ChatRoomDiffCallback : DiffUtil.ItemCallback() { +private class ChatRoomDiffCallback : DiffUtil.ItemCallback() { override fun areItemsTheSame( - oldItem: ChatRoom, - newItem: ChatRoom + oldItem: ChatRoomViewModel, + newItem: ChatRoomViewModel ): Boolean { - return oldItem.localAddress.weakEqual(newItem.localAddress) && - oldItem.peerAddress.weakEqual(newItem.peerAddress) + return oldItem.chatRoom == newItem.chatRoom } override fun areContentsTheSame( - oldItem: ChatRoom, - newItem: ChatRoom + oldItem: ChatRoomViewModel, + newItem: ChatRoomViewModel ): Boolean { - return newItem.unreadMessagesCount == 0 + return newItem.unreadMessagesCount.value == 0 } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt index fe996a6e2..593b0d570 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt @@ -110,10 +110,10 @@ class MasterChatRoomsFragment : MasterFragment - adapter.notifyItemChanged(position) - }) - listViewModel.contactsUpdatedEvent.observe(viewLifecycleOwner, { it.consume { adapter.notifyDataSetChanged() @@ -268,8 +264,8 @@ class MasterChatRoomsFragment : MasterFragment) { val list = ArrayList() for (index in indexesOfItemToDelete) { - val chatRoom = adapter.currentList[index] - list.add(chatRoom) + val chatRoomViewModel = adapter.currentList[index] + list.add(chatRoomViewModel.chatRoom) } listViewModel.deleteChatRooms(list) } 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 85f0689d1..d80d47d77 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 @@ -130,6 +130,12 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf ) { callInProgress.value = core.callsNb > 0 } + + override fun onChatRoomRead(core: Core, room: ChatRoom) { + if (room == chatRoom) { + unreadMessagesCount.value = 0 + } + } } private val chatRoomListener: ChatRoomListenerStub = object : ChatRoomListenerStub() { @@ -216,11 +222,14 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf } override fun onCleared() { + destroy() + super.onCleared() + } + + fun destroy() { coreContext.contactsManager.removeListener(contactsUpdatedListener) chatRoom.removeListener(chatRoomListener) chatRoom.core.removeListener(coreListener) - - super.onCleared() } fun contactLookup() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomsListViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomsListViewModel.kt index 8368e0ce5..87d685e04 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomsListViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomsListViewModel.kt @@ -31,9 +31,7 @@ import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils class ChatRoomsListViewModel : ErrorReportingViewModel() { - val chatRooms = MutableLiveData>() - - val latestUpdatedChatRoomId = MutableLiveData() + val chatRooms = MutableLiveData>() val contactsUpdatedEvent: MutableLiveData> by lazy { MutableLiveData>() @@ -57,46 +55,33 @@ class ChatRoomsListViewModel : ErrorReportingViewModel() { private val listener: CoreListenerStub = object : CoreListenerStub() { override fun onChatRoomStateChanged(core: Core, chatRoom: ChatRoom, state: ChatRoom.State) { if (state == ChatRoom.State.Created) { - updateChatRooms() + addChatRoom(chatRoom) } else if (state == ChatRoom.State.TerminationFailed) { Log.e("[Chat Rooms] Group chat room removal for address ${chatRoom.peerAddress.asStringUriOnly()} has failed !") onErrorEvent.value = Event(R.string.chat_room_removal_failed_snack) } } - override fun onChatRoomSubjectChanged(core: Core, chatRoom: ChatRoom) { - updateChatRoom(chatRoom) - } - - override fun onChatRoomRead(core: Core, chatRoom: ChatRoom) { - updateChatRoom(chatRoom) - } - override fun onMessageSent(core: Core, chatRoom: ChatRoom, message: ChatMessage) { - if (chatRooms.value?.indexOf(chatRoom) == 0) updateChatRoom(chatRoom) - else updateChatRooms() + if (findChatRoomIndex(chatRoom) != 0) reorderChatRooms() } override fun onMessageReceived(core: Core, chatRoom: ChatRoom, message: ChatMessage) { - if (chatRooms.value?.indexOf(chatRoom) == 0) updateChatRoom(chatRoom) - else updateChatRooms() - } - - override fun onMessageReceivedUnableDecrypt( - core: Core, - chatRoom: ChatRoom, - message: ChatMessage - ) { - updateChatRooms() + if (findChatRoomIndex(chatRoom) != 0) reorderChatRooms() } } private val chatRoomListener = object : ChatRoomListenerStub() { override fun onStateChanged(chatRoom: ChatRoom, newState: ChatRoom.State) { if (newState == ChatRoom.State.Deleted) { - val list = arrayListOf() - list.addAll(chatRooms.value.orEmpty()) - list.remove(chatRoom) + val list = arrayListOf() + for (chatRoomViewModel in chatRooms.value.orEmpty()) { + if (chatRoomViewModel.chatRoom != chatRoom) { + list.add(chatRoomViewModel) + } else { + chatRoomViewModel.destroy() + } + } chatRooms.value = list } } @@ -145,15 +130,42 @@ class ChatRoomsListViewModel : ErrorReportingViewModel() { } } - private fun updateChatRoom(chatRoom: ChatRoom) { - latestUpdatedChatRoomId.value = chatRooms.value?.indexOf(chatRoom) - } - private fun updateChatRooms() { - val list = arrayListOf() - - list.addAll(coreContext.core.chatRooms) + for (chatRoomViewModel in chatRooms.value.orEmpty()) { + chatRoomViewModel.destroy() + } + val list = arrayListOf() + for (chatRoom in coreContext.core.chatRooms) { + val viewModel = ChatRoomViewModel(chatRoom) + list.add(viewModel) + } chatRooms.value = list } + + private fun addChatRoom(chatRoom: ChatRoom) { + val list = arrayListOf() + val viewModel = ChatRoomViewModel(chatRoom) + list.add(viewModel) + list.addAll(chatRooms.value.orEmpty()) + chatRooms.value = list + } + + private fun reorderChatRooms() { + val list = arrayListOf() + list.addAll(chatRooms.value.orEmpty()) + list.sortByDescending { chatRoomViewModel -> chatRoomViewModel.chatRoom.lastUpdateTime } + chatRooms.value = list + } + + private fun findChatRoomIndex(chatRoom: ChatRoom): Int { + var index = 0 + for (chatRoomViewModel in chatRooms.value.orEmpty()) { + if (chatRoomViewModel.chatRoom == chatRoom) { + return index + } + index++ + } + return -1 + } } diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 0f4f17894..6084a2afa 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -552,9 +552,10 @@ class CoreContext(val context: Context, coreConfig: Config) { if (overlayY == 0f) overlayY = AppUtils.pixelsToDp(40f) val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager + // WRAP_CONTENT doesn't work well on some launchers... val params: WindowManager.LayoutParams = WindowManager.LayoutParams( - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.WRAP_CONTENT, + AppUtils.getDimension(R.dimen.call_overlay_size).toInt(), + AppUtils.getDimension(R.dimen.call_overlay_size).toInt(), Compatibility.getOverlayType(), WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index 987cdabb8..8739f7fb6 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -7,7 +7,7 @@ 3dp 200dp 100dp - 150dp + 120dp 30dp 600dp 200dp