Chat room scrolling optimizations

This commit is contained in:
Sylvain Berfini 2021-06-07 10:52:43 +02:00
parent 0415629299
commit e045e6daad
6 changed files with 59 additions and 42 deletions

View file

@ -325,7 +325,10 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
} }
binding.setStartCallClickListener { binding.setStartCallClickListener {
coreContext.startCall(viewModel.addressToCall) val address = viewModel.addressToCall
if (address != null) {
coreContext.startCall(address)
}
} }
if (textToShare?.isNotEmpty() == true) { if (textToShare?.isNotEmpty() == true) {
@ -432,8 +435,11 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
dialogViewModel.showOkButton({ doNotAskAgain -> dialogViewModel.showOkButton({ doNotAskAgain ->
if (doNotAskAgain) corePreferences.limeSecurityPopupEnabled = false if (doNotAskAgain) corePreferences.limeSecurityPopupEnabled = false
val address = viewModel.onlyParticipantOnlyDeviceAddress
if (viewModel.oneParticipantOneDevice) { if (viewModel.oneParticipantOneDevice) {
coreContext.startCall(viewModel.onlyParticipantOnlyDeviceAddress, true) if (address != null) {
coreContext.startCall(address, true)
}
} else { } else {
navigateToDevices() navigateToDevices()
} }
@ -443,8 +449,11 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
dialog.show() dialog.show()
} else { } else {
val address = viewModel.onlyParticipantOnlyDeviceAddress
if (viewModel.oneParticipantOneDevice) { if (viewModel.oneParticipantOneDevice) {
coreContext.startCall(viewModel.onlyParticipantOnlyDeviceAddress, true) if (address != null) {
coreContext.startCall(address, true)
}
} else { } else {
navigateToDevices() navigateToDevices()
} }

View file

@ -89,6 +89,7 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
// SubmitList is done on a background thread // SubmitList is done on a background thread
// We need this adapter data observer to know when to scroll // We need this adapter data observer to know when to scroll
adapter.registerAdapterDataObserver(observer) adapter.registerAdapterDataObserver(observer)
binding.chatList.setHasFixedSize(true)
binding.chatList.adapter = adapter binding.chatList.adapter = adapter
val layoutManager = LinearLayoutManager(activity) val layoutManager = LinearLayoutManager(activity)

View file

@ -45,21 +45,21 @@ class ChatRoomViewModelFactory(private val chatRoom: ChatRoom) :
class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterface { class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterface {
override val contact = MutableLiveData<Contact>() override val contact = MutableLiveData<Contact>()
override val displayName: String override val displayName: String = when {
get() { chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) -> LinphoneUtils.getDisplayName(
return when { chatRoom.peerAddress
chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) -> LinphoneUtils.getDisplayName(chatRoom.peerAddress) )
chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) -> LinphoneUtils.getDisplayName(chatRoom.participants.firstOrNull()?.address ?: chatRoom.peerAddress) chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) -> LinphoneUtils.getDisplayName(
chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) -> chatRoom.subject.orEmpty() chatRoom.participants.firstOrNull()?.address ?: chatRoom.peerAddress
else -> chatRoom.peerAddress.asStringUriOnly() )
} chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) -> chatRoom.subject.orEmpty()
} else -> chatRoom.peerAddress.asStringUriOnly()
}
override val securityLevel: ChatRoomSecurityLevel override val securityLevel: ChatRoomSecurityLevel = chatRoom.securityLevel
get() = chatRoom.securityLevel
override val showGroupChatAvatar: Boolean override val showGroupChatAvatar: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) &&
get() = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) && !chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) !chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())
val subject = MutableLiveData<String>() val subject = MutableLiveData<String>()
@ -81,38 +81,19 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf
val securityLevelContentDescription = MutableLiveData<Int>() val securityLevelContentDescription = MutableLiveData<Int>()
val oneToOneChatRoom: Boolean val peerSipUri = MutableLiveData<String>()
get() = chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())
val encryptedChatRoom: Boolean val oneToOneChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())
get() = chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())
val basicChatRoom: Boolean val encryptedChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())
get() = chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt())
val peerSipUri: String val basicChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt())
get() = if (oneToOneChatRoom && !basicChatRoom)
chatRoom.participants.firstOrNull()?.address?.asStringUriOnly()
?: chatRoom.peerAddress.asStringUriOnly()
else chatRoom.peerAddress.asStringUriOnly()
val oneParticipantOneDevice: Boolean var oneParticipantOneDevice: Boolean = false
get() {
return chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) &&
chatRoom.me?.devices?.size == 1 &&
chatRoom.participants.first().devices.size == 1
}
val addressToCall: Address var addressToCall: Address? = null
get() {
return if (chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()))
chatRoom.peerAddress
else
chatRoom.participants.first().address
}
val onlyParticipantOnlyDeviceAddress: Address var onlyParticipantOnlyDeviceAddress: Address? = null
get() = chatRoom.participants.first().devices.first().address
private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() {
override fun onContactsUpdated() { override fun onContactsUpdated() {
@ -164,11 +145,13 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf
override fun onParticipantAdded(chatRoom: ChatRoom, eventLog: EventLog) { override fun onParticipantAdded(chatRoom: ChatRoom, eventLog: EventLog) {
contactLookup() contactLookup()
updateSecurityIcon() updateSecurityIcon()
updateParticipants()
} }
override fun onParticipantRemoved(chatRoom: ChatRoom, eventLog: EventLog) { override fun onParticipantRemoved(chatRoom: ChatRoom, eventLog: EventLog) {
contactLookup() contactLookup()
updateSecurityIcon() updateSecurityIcon()
updateParticipants()
} }
override fun onIsComposingReceived( override fun onIsComposingReceived(
@ -191,10 +174,12 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf
override fun onParticipantDeviceAdded(chatRoom: ChatRoom, eventLog: EventLog) { override fun onParticipantDeviceAdded(chatRoom: ChatRoom, eventLog: EventLog) {
updateSecurityIcon() updateSecurityIcon()
updateParticipants()
} }
override fun onParticipantDeviceRemoved(chatRoom: ChatRoom, eventLog: EventLog) { override fun onParticipantDeviceRemoved(chatRoom: ChatRoom, eventLog: EventLog) {
updateSecurityIcon() updateSecurityIcon()
updateParticipants()
} }
override fun onEphemeralMessageDeleted(chatRoom: ChatRoom, eventLog: EventLog) { override fun onEphemeralMessageDeleted(chatRoom: ChatRoom, eventLog: EventLog) {
@ -216,6 +201,7 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf
updateSecurityIcon() updateSecurityIcon()
contactLookup() contactLookup()
updateParticipants()
callInProgress.value = chatRoom.core.callsNb > 0 callInProgress.value = chatRoom.core.callsNb > 0
updateRemotesComposing() updateRemotesComposing()
@ -317,4 +303,22 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf
} }
composingList.value = AppUtils.getStringWithPlural(R.plurals.chat_room_remote_composing, chatRoom.composingAddresses.size, composing) composingList.value = AppUtils.getStringWithPlural(R.plurals.chat_room_remote_composing, chatRoom.composingAddresses.size, composing)
} }
private fun updateParticipants() {
peerSipUri.value = if (oneToOneChatRoom && !basicChatRoom)
chatRoom.participants.firstOrNull()?.address?.asStringUriOnly()
?: chatRoom.peerAddress.asStringUriOnly()
else chatRoom.peerAddress.asStringUriOnly()
oneParticipantOneDevice = chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) &&
chatRoom.me?.devices?.size == 1 &&
chatRoom.participants.firstOrNull()?.devices?.size == 1
addressToCall = if (chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()))
chatRoom.peerAddress
else
chatRoom.participants.firstOrNull()?.address
onlyParticipantOnlyDeviceAddress = chatRoom.participants.firstOrNull()?.devices?.firstOrNull()?.address
}
} }

View file

@ -74,6 +74,7 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
} }
_adapter = ContactsListAdapter(listSelectionViewModel, viewLifecycleOwner) _adapter = ContactsListAdapter(listSelectionViewModel, viewLifecycleOwner)
binding.contactsList.setHasFixedSize(true)
binding.contactsList.adapter = adapter binding.contactsList.adapter = adapter
binding.setEditClickListener { binding.setEditClickListener {

View file

@ -80,6 +80,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
// SubmitList is done on a background thread // SubmitList is done on a background thread
// We need this adapter data observer to know when to scroll // We need this adapter data observer to know when to scroll
adapter.registerAdapterDataObserver(observer) adapter.registerAdapterDataObserver(observer)
binding.callLogsList.setHasFixedSize(true)
binding.callLogsList.adapter = adapter binding.callLogsList.adapter = adapter
binding.setEditClickListener { binding.setEditClickListener {

View file

@ -56,6 +56,7 @@ class RecordingsFragment : MasterFragment<RecordingsFragmentBinding, RecordingsL
binding.viewModel = viewModel binding.viewModel = viewModel
_adapter = RecordingsListAdapter(listSelectionViewModel, viewLifecycleOwner) _adapter = RecordingsListAdapter(listSelectionViewModel, viewLifecycleOwner)
binding.recordingsList.setHasFixedSize(true)
binding.recordingsList.adapter = adapter binding.recordingsList.adapter = adapter
val layoutManager = LinearLayoutManager(activity) val layoutManager = LinearLayoutManager(activity)