Chat room scrolling optimizations
This commit is contained in:
parent
0415629299
commit
e045e6daad
6 changed files with 59 additions and 42 deletions
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue